/** * Copyright (c) 2014-2017 by the respective copyright holders. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.eclipse.smarthome.binding.lifx.internal.fields; import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Objects; import javax.xml.bind.DatatypeConverter; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Tim Buckley * @author Karel Goderis */ public class MACAddress { private Logger logger = LoggerFactory.getLogger(MACAddress.class); private ByteBuffer bytes; private String hex; public ByteBuffer getBytes() { return bytes; } public String getHex() { return hex; } public MACAddress(ByteBuffer bytes) { this.bytes = bytes; createHex(); } public MACAddress(String string, boolean isHex) { if (!isHex) { this.bytes = ByteBuffer.wrap(string.getBytes()); createHex(); } else { this.bytes = ByteBuffer.wrap(DatatypeConverter.parseHexBinary(string)); try { formatHex(string, 2, ":"); } catch (IOException e) { logger.error("An exception occurred while formatting an HEX string : '{}'", e.getMessage()); } } } public MACAddress() { this(ByteBuffer.allocate(6)); } private void createHex() { bytes.rewind(); List<String> byteStrings = new LinkedList<>(); while (bytes.hasRemaining()) { byteStrings.add(String.format("%02X", bytes.get())); } hex = StringUtils.join(byteStrings, ':'); bytes.rewind(); } public String getAsLabel() { bytes.rewind(); StringBuilder hex = new StringBuilder(); while (bytes.hasRemaining()) { hex.append(String.format("%02X", bytes.get())); } bytes.rewind(); return hex.toString(); } private void formatHex(String original, int length, String separator) throws IOException { ByteArrayInputStream bis = new ByteArrayInputStream(original.getBytes()); byte[] buffer = new byte[length]; String result = ""; while (bis.read(buffer) > 0) { for (byte b : buffer) { result += (char) b; } Arrays.fill(buffer, (byte) 0); result += separator; } hex = StringUtils.left(result, result.length() - 1); } @Override public int hashCode() { int hash = 7; hash = 97 * hash + Objects.hashCode(this.hex); return hash; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final MACAddress other = (MACAddress) obj; if (!this.hex.equalsIgnoreCase(other.hex)) { return false; } return true; } }