/* * Copyright (c) 2013 EMC Corporation * All Rights Reserved */ package com.emc.storageos.coordinator.client.model; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.commons.lang.builder.HashCodeBuilder; import com.emc.storageos.services.util.Strings; import com.emc.storageos.coordinator.exceptions.DecodingException; import com.emc.storageos.coordinator.exceptions.CoordinatorException; import com.emc.storageos.coordinator.exceptions.InvalidRepositoryInfoException; import com.emc.storageos.coordinator.exceptions.InvalidSoftwareVersionException; public class RepositoryInfo implements CoordinatorSerializable { public static final String CONFIG_KIND = "upgradetargetconfig"; public static final String CONFIG_ID = "global"; private static final String ENCODING_INVALID = ""; private static final String ENCODING_SEPARATOR = "\0"; private final SoftwareVersion _current; private final List<SoftwareVersion> _versions; public RepositoryInfo() { _current = null; _versions = null; } public RepositoryInfo(final SoftwareVersion current, final List<SoftwareVersion> available) throws InvalidRepositoryInfoException { if (current == null || available == null || !available.contains(current)) { throw CoordinatorException.fatals.invalidRepoInfoError("current=" + Strings.repr(current) + " versions=" + Strings.repr(available)); } List<SoftwareVersion> versions = new ArrayList<SoftwareVersion>(available); Collections.sort(versions); _versions = Collections.unmodifiableList(versions); _current = current; } public List<SoftwareVersion> getVersions() { return _versions; } public SoftwareVersion getCurrentVersion() { return _current; } public boolean hasSameVersions(final RepositoryInfo state) { return _versions.equals(state._versions); } @Override public String toString() { return "current=" + Strings.repr(_current) + " available=" + Strings.repr(_versions); } @Override public boolean equals(Object object) { if (object == null) { return false; } final RepositoryInfo state = (RepositoryInfo) object; return (_current == null ? state._current == null : _current.equals(state._current)) && hasSameVersions(state); } @Override public int hashCode() { HashCodeBuilder builder = new HashCodeBuilder(); return builder.append(this._current).append(this._versions).toHashCode(); } @Override public String encodeAsString() { final StringBuilder s = new StringBuilder(); s.append(_current != null ? _current : ENCODING_INVALID); for (SoftwareVersion v : _versions) { s.append(ENCODING_SEPARATOR); s.append(v); } return s.toString(); } @Override public RepositoryInfo decodeFromString(String infoStr) throws DecodingException { if (infoStr == null) { return null; } final String[] strings = infoStr.split(ENCODING_SEPARATOR); if (strings.length == 0) { throw CoordinatorException.fatals.decodingError("Empty string"); } try { final SoftwareVersion current = new SoftwareVersion(strings[0]); final List<SoftwareVersion> versions = new ArrayList<SoftwareVersion>(); for (int i = 1; i < strings.length; i++) { versions.add(new SoftwareVersion(strings[i])); } return new RepositoryInfo(current, versions); } catch (InvalidSoftwareVersionException e) { throw CoordinatorException.fatals.decodingError(e.getMessage()); } catch (InvalidRepositoryInfoException e) { throw CoordinatorException.fatals.decodingError(e.getMessage()); } } @Override public CoordinatorClassInfo getCoordinatorClassInfo() { return new CoordinatorClassInfo(CONFIG_ID, CONFIG_KIND, "repositoryInfo"); } }