/*
* Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved.
*
* Licensed 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 com.hazelcast.scheduledexecutor.impl;
import com.hazelcast.nio.Address;
import com.hazelcast.nio.ObjectDataInput;
import com.hazelcast.nio.ObjectDataOutput;
import com.hazelcast.scheduledexecutor.ScheduledTaskHandler;
import java.io.IOException;
import java.net.UnknownHostException;
public final class ScheduledTaskHandlerImpl
extends ScheduledTaskHandler {
private static final String URN_BASE = "urn:hzScheduledTaskHandler:";
private static final char DESC_SEP = '\0';
private static final int URN_PARTS = 4;
private Address address;
private int partitionId;
private String schedulerName;
private String taskName;
public ScheduledTaskHandlerImpl() {
}
private ScheduledTaskHandlerImpl(int partitionId, String schedulerName, String taskName) {
super();
this.partitionId = partitionId;
this.schedulerName = schedulerName;
this.taskName = taskName;
this.address = null;
}
private ScheduledTaskHandlerImpl(Address address, String schedulerName, String taskName) {
super();
this.address = address;
this.schedulerName = schedulerName;
this.taskName = taskName;
this.partitionId = -1;
}
@Override
public Address getAddress() {
return address;
}
@Override
public int getPartitionId() {
return partitionId;
}
@Override
public String getSchedulerName() {
return schedulerName;
}
@Override
public String getTaskName() {
return taskName;
}
@Override
public boolean isAssignedToPartition() {
return address == null;
}
@Override
public boolean isAssignedToMember() {
return address != null;
}
@Override
public String toUrn() {
return URN_BASE
+ (address == null
? "-"
: (address.getHost() + ":" + String.valueOf(address.getPort()))) + DESC_SEP
+ String.valueOf(partitionId) + DESC_SEP
+ schedulerName + DESC_SEP
+ taskName;
}
@Override
public int getFactoryId() {
return ScheduledExecutorDataSerializerHook.F_ID;
}
@Override
public int getId() {
return ScheduledExecutorDataSerializerHook.TASK_HANDLER;
}
@Override
public void writeData(ObjectDataOutput out)
throws IOException {
out.writeUTF(toUrn());
}
@Override
public void readData(ObjectDataInput in)
throws IOException {
ScheduledTaskHandler handler = of(in.readUTF());
this.address = handler.getAddress();
this.partitionId = handler.getPartitionId();
this.schedulerName = handler.getSchedulerName();
this.taskName = handler.getTaskName();
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ScheduledTaskHandlerImpl that = (ScheduledTaskHandlerImpl) o;
if (partitionId != that.partitionId) {
return false;
}
if (address != null ? !address.equals(that.address) : that.address != null) {
return false;
}
if (!schedulerName.equals(that.schedulerName)) {
return false;
}
return taskName.equals(that.taskName);
}
@Override
public int hashCode() {
int result = address != null ? address.hashCode() : 0;
result = 31 * result + partitionId;
result = 31 * result + schedulerName.hashCode();
result = 31 * result + taskName.hashCode();
return result;
}
@Override
public String toString() {
return "ScheduledTaskHandler{" + "address=" + address + ", partitionId=" + partitionId + ", schedulerName='"
+ schedulerName + '\'' + ", taskName='" + taskName + '\'' + '}';
}
public static ScheduledTaskHandler of(Address addr, String schedulerName, String taskName) {
return new ScheduledTaskHandlerImpl(addr, schedulerName, taskName);
}
public static ScheduledTaskHandler of(int partitionId, String schedulerName, String taskName) {
return new ScheduledTaskHandlerImpl(partitionId, schedulerName, taskName);
}
public static ScheduledTaskHandler of(String urn) {
if (!urn.startsWith(ScheduledTaskHandlerImpl.URN_BASE)) {
throw new IllegalArgumentException("Wrong urn format.");
}
// Get rid of urn base
urn = urn.replace(ScheduledTaskHandlerImpl.URN_BASE, "");
String[] parts = urn.split(String.valueOf(ScheduledTaskHandlerImpl.DESC_SEP));
if (parts.length != URN_PARTS) {
throw new IllegalArgumentException("Wrong urn format.");
}
Address addr = null;
if (!"-".equals(parts[0])) {
String[] hostParts = parts[0].split(":");
try {
addr = new Address(hostParts[0], Integer.parseInt(hostParts[1]));
} catch (UnknownHostException e) {
throw new IllegalArgumentException("Wrong urn format.", e);
}
}
int partitionId = Integer.parseInt(parts[1]);
String scheduler = parts[2];
String task = parts[3];
return addr != null
? new ScheduledTaskHandlerImpl(addr, scheduler, task)
: new ScheduledTaskHandlerImpl(partitionId, scheduler, task);
}
}