Coverage Report - org.apache.shiro.util.SimpleByteSource
 
Classes in this File Line Coverage Branch Coverage Complexity
SimpleByteSource
43%
16/37
42%
12/28
1.938
SimpleByteSource$1
N/A
N/A
1.938
SimpleByteSource$BytesHelper
0%
0/3
N/A
1.938
 
 1  
 /*
 2  
  * Licensed to the Apache Software Foundation (ASF) under one
 3  
  * or more contributor license agreements.  See the NOTICE file
 4  
  * distributed with this work for additional information
 5  
  * regarding copyright ownership.  The ASF licenses this file
 6  
  * to you under the Apache License, Version 2.0 (the
 7  
  * "License"); you may not use this file except in compliance
 8  
  * with the License.  You may obtain a copy of the License at
 9  
  *
 10  
  *     http://www.apache.org/licenses/LICENSE-2.0
 11  
  *
 12  
  * Unless required by applicable law or agreed to in writing,
 13  
  * software distributed under the License is distributed on an
 14  
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 15  
  * KIND, either express or implied.  See the License for the
 16  
  * specific language governing permissions and limitations
 17  
  * under the License.
 18  
  */
 19  
 package org.apache.shiro.util;
 20  
 
 21  
 import org.apache.shiro.codec.Base64;
 22  
 import org.apache.shiro.codec.CodecSupport;
 23  
 import org.apache.shiro.codec.Hex;
 24  
 
 25  
 import java.io.File;
 26  
 import java.io.InputStream;
 27  
 import java.util.Arrays;
 28  
 
 29  
 /**
 30  
  * Very simple {@link ByteSource ByteSource} implementation that maintains an internal {@code byte[]} array and uses the
 31  
  * {@link Hex Hex} and {@link Base64 Base64} codec classes to support the
 32  
  * {@link #toHex() toHex()} and {@link #toBase64() toBase64()} implementations.
 33  
  * <p/>
 34  
  * The constructors on this class accept the following implicit byte-backed data types and will convert them to
 35  
  * a byte-array automatically:
 36  
  * <ul>
 37  
  * <li>byte[]</li>
 38  
  * <li>char[]</li>
 39  
  * <li>String</li>
 40  
  * <li>{@link ByteSource ByteSource}</li>
 41  
  * <li>{@link File File}</li>
 42  
  * <li>{@link InputStream InputStream}</li>
 43  
  * </ul>
 44  
  *
 45  
  * @since 1.0
 46  
  */
 47  
 public class SimpleByteSource implements ByteSource {
 48  
 
 49  
     private final byte[] bytes;
 50  
     private String cachedHex;
 51  
     private String cachedBase64;
 52  
 
 53  125
     public SimpleByteSource(byte[] bytes) {
 54  125
         this.bytes = bytes;
 55  125
     }
 56  
 
 57  
     /**
 58  
      * Creates an instance by converting the characters to a byte array (assumes UTF-8 encoding).
 59  
      *
 60  
      * @param chars the source characters to use to create the underlying byte array.
 61  
      * @since 1.1
 62  
      */
 63  0
     public SimpleByteSource(char[] chars) {
 64  0
         this.bytes = CodecSupport.toBytes(chars);
 65  0
     }
 66  
 
 67  
     /**
 68  
      * Creates an instance by converting the String to a byte array (assumes UTF-8 encoding).
 69  
      *
 70  
      * @param string the source string to convert to a byte array (assumes UTF-8 encoding).
 71  
      * @since 1.1
 72  
      */
 73  40
     public SimpleByteSource(String string) {
 74  40
         this.bytes = CodecSupport.toBytes(string);
 75  40
     }
 76  
 
 77  
     /**
 78  
      * Creates an instance using the sources bytes directly - it does not create a copy of the
 79  
      * argument's byte array.
 80  
      *
 81  
      * @param source the source to use to populate the underlying byte array.
 82  
      * @since 1.1
 83  
      */
 84  0
     public SimpleByteSource(ByteSource source) {
 85  0
         this.bytes = source.getBytes();
 86  0
     }
 87  
 
 88  
     /**
 89  
      * Creates an instance by converting the file to a byte array.
 90  
      *
 91  
      * @param file the file from which to acquire bytes.
 92  
      * @since 1.1
 93  
      */
 94  0
     public SimpleByteSource(File file) {
 95  0
         this.bytes = new BytesHelper().getBytes(file);
 96  0
     }
 97  
 
 98  
     /**
 99  
      * Creates an instance by converting the stream to a byte array.
 100  
      *
 101  
      * @param stream the stream from which to acquire bytes.
 102  
      * @since 1.1
 103  
      */
 104  0
     public SimpleByteSource(InputStream stream) {
 105  0
         this.bytes = new BytesHelper().getBytes(stream);
 106  0
     }
 107  
 
 108  
     /**
 109  
      * Returns {@code true} if the specified object is a recognized data type that can be easily converted to
 110  
      * bytes by instances of this class, {@code false} otherwise.
 111  
      * <p/>
 112  
      * This implementation returns {@code true} IFF the specified object is an instance of one of the following
 113  
      * types:
 114  
      * <ul>
 115  
      * <li>{@code byte[]}</li>
 116  
      * <li>{@code char[]}</li>
 117  
      * <li>{@link ByteSource}</li>
 118  
      * <li>{@link String}</li>
 119  
      * <li>{@link File}</li>
 120  
      * </li>{@link InputStream}</li>
 121  
      * </ul>
 122  
      *
 123  
      * @param o the object to test to see if it can be easily converted to bytes by instances of this class.
 124  
      * @return {@code true} if the specified object can be easily converted to bytes by instances of this class,
 125  
      *         {@code false} otherwise.
 126  
      * @since 1.2
 127  
      */
 128  
     public static boolean isCompatible(Object o) {
 129  37
         return o instanceof byte[] || o instanceof char[] || o instanceof String ||
 130  
                 o instanceof ByteSource || o instanceof File || o instanceof InputStream;
 131  
     }
 132  
 
 133  
     public byte[] getBytes() {
 134  171
         return this.bytes;
 135  
     }
 136  
 
 137  
     public boolean isEmpty() {
 138  60
         return this.bytes == null || this.bytes.length == 0;
 139  
     }
 140  
 
 141  
     public String toHex() {
 142  0
         if ( this.cachedHex == null ) {
 143  0
             this.cachedHex = Hex.encodeToString(getBytes());
 144  
         }
 145  0
         return this.cachedHex;
 146  
     }
 147  
 
 148  
     public String toBase64() {
 149  10
         if ( this.cachedBase64 == null ) {
 150  8
             this.cachedBase64 = Base64.encodeToString(getBytes());
 151  
         }
 152  10
         return this.cachedBase64;
 153  
     }
 154  
 
 155  
     public String toString() {
 156  0
         return toBase64();
 157  
     }
 158  
 
 159  
     public int hashCode() {
 160  0
         if (this.bytes == null || this.bytes.length == 0) {
 161  0
             return 0;
 162  
         }
 163  0
         return Arrays.hashCode(this.bytes);
 164  
     }
 165  
 
 166  
     public boolean equals(Object o) {
 167  1
         if (o == this) {
 168  0
             return true;
 169  
         }
 170  1
         if (o instanceof ByteSource) {
 171  1
             ByteSource bs = (ByteSource) o;
 172  1
             return Arrays.equals(getBytes(), bs.getBytes());
 173  
         }
 174  0
         return false;
 175  
     }
 176  
 
 177  
     //will probably be removed in Shiro 2.0.  See SHIRO-203:
 178  
     //https://issues.apache.org/jira/browse/SHIRO-203
 179  0
     private static final class BytesHelper extends CodecSupport {
 180  
         public byte[] getBytes(File file) {
 181  0
             return toBytes(file);
 182  
         }
 183  
 
 184  
         public byte[] getBytes(InputStream stream) {
 185  0
             return toBytes(stream);
 186  
         }
 187  
     }
 188  
 }