/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.brooklyn.core.mgmt.ha.dto; import java.io.Serializable; import java.net.URI; import org.apache.brooklyn.api.mgmt.ha.ManagementNodeState; import org.apache.brooklyn.api.mgmt.ha.ManagementNodeSyncRecord; import org.apache.brooklyn.core.BrooklynVersion; import org.apache.brooklyn.util.time.Time; import org.codehaus.jackson.annotate.JsonAutoDetect; import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; import com.google.common.base.Objects; /** * Represents the state of a management node within the Brooklyn management plane * (DTO class). * * @author aled */ @JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE) public class BasicManagementNodeSyncRecord implements ManagementNodeSyncRecord, Serializable { private static final long serialVersionUID = 4918161834047884244L; public static Builder builder() { return new Builder(); } public static class Builder { private String brooklynVersion = BrooklynVersion.get(); protected String nodeId; protected URI uri; protected ManagementNodeState status; protected Long priority; protected long localTimestamp; protected Long remoteTimestamp; protected Builder self() { return (Builder) this; } public Builder brooklynVersion(String val) { brooklynVersion = val; return self(); } public Builder nodeId(String val) { nodeId = val; return self(); } public Builder uri(URI val) { uri = val; return self(); } public Builder status(ManagementNodeState val) { status = val; return self(); } public Builder priority(Long val) { priority = val; return self(); } public Builder localTimestamp(long val) { localTimestamp = val; return self(); } public Builder remoteTimestamp(Long val) { remoteTimestamp = val; return self(); } public Builder from(ManagementNodeSyncRecord other) { return from(other, false); } public Builder from(ManagementNodeSyncRecord other, boolean ignoreNulls) { if (ignoreNulls && other==null) return this; if (other.getBrooklynVersion()!=null) brooklynVersion = other.getBrooklynVersion(); if (other.getNodeId()!=null) nodeId = other.getNodeId(); if (other.getUri()!=null) uri = other.getUri(); if (other.getStatus()!=null) status = other.getStatus(); if (other.getPriority()!=null) priority = other.getPriority(); if (other.getLocalTimestamp()>0) localTimestamp = other.getLocalTimestamp(); if (other.getRemoteTimestamp()!=null) remoteTimestamp = other.getRemoteTimestamp(); return this; } public ManagementNodeSyncRecord build() { return new BasicManagementNodeSyncRecord(this); } } private String brooklynVersion; private String nodeId; private URI uri; private ManagementNodeState status; private Long priority; private Long localTimestamp; private Long remoteTimestamp; /** @deprecated since 0.7.0, use {@link #localTimestamp} or {@link #remoteTimestamp}, * but kept (or rather added back in) to support deserializing previous instances */ @Deprecated private Long timestampUtc; // for de-serialization @SuppressWarnings("unused") private BasicManagementNodeSyncRecord() { } // Trusts the builder to not mess around with mutability concurrently with build(). protected BasicManagementNodeSyncRecord(Builder builder) { brooklynVersion = builder.brooklynVersion; nodeId = builder.nodeId; uri = builder.uri; status = builder.status; priority = builder.priority; localTimestamp = builder.localTimestamp; remoteTimestamp = builder.remoteTimestamp; } @Override public String getBrooklynVersion() { return brooklynVersion; } @Override public String getNodeId() { return nodeId; } @Override public URI getUri() { return uri; } @Override public ManagementNodeState getStatus() { return status; } @Override public Long getPriority() { return priority; } @Override public long getLocalTimestamp() { if (localTimestamp!=null) return localTimestamp; if (timestampUtc!=null) return timestampUtc; throw new NullPointerException("localTimestamp not known for "+getNodeId()); } @Override public Long getRemoteTimestamp() { return remoteTimestamp; } @Override public String toString() { return Objects.toStringHelper(this) .add("nodeId", getNodeId()) .add("status", getStatus()).toString(); } @Override public String toVerboseString() { return Objects.toStringHelper(this) .omitNullValues() .add("brooklynVersion", getBrooklynVersion()) .add("nodeId", getNodeId()) .add("uri", getUri()) .add("status", getStatus()) .add("priority", getPriority()) .add("localTimestamp", getLocalTimestamp()+"="+Time.makeDateString(getLocalTimestamp())) .add("remoteTimestamp", getRemoteTimestamp()+(getRemoteTimestamp()==null ? "" : "="+Time.makeDateString(getRemoteTimestamp()))) .toString(); } /** used here for store to inject remote timestamp */ public void setRemoteTimestamp(Long remoteTimestamp) { this.remoteTimestamp = remoteTimestamp; } }