/*
* The MIT License
*
* Copyright 2011 Sony Ericsson Mobile Communications. All rights reserved.
* Copyright 2012 Sony Mobile Communications AB. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.sonyericsson.jenkins.plugins.externalresource.dispatcher.data;
import com.sonyericsson.jenkins.plugins.externalresource.dispatcher.Constants;
import net.sf.json.JSONObject;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
/**
* Information about the "stashed" status of an {@link ExternalResource}. I.e. The lock and reservation status.
*
* @author Robert Sandell <robert.sandell@sonyericsson.com>
*/
public class StashInfo implements Serializable, Cloneable {
private String stashedBy;
private StashType type;
private Lease lease;
private String key;
/**
* Standard Constructor.
*
* @param type the general type of what stashed the resource.
* @param stashedBy exactly what stashed it.
* @param lease when will it end.
* @param key the key to use when releasing.
*/
public StashInfo(StashType type, String stashedBy, Lease lease, String key) {
this.stashedBy = stashedBy;
this.type = type;
this.lease = lease;
this.key = key;
}
/**
* Creates a new object with info from the StashResult. The type will be defaulted to {@link
* StashInfo.StashType#INTERNAL}.
*
* @param result the result from a {@link
* com.sonyericsson.jenkins.plugins.externalresource.dispatcher.utils.resourcemanagers.ExternalResourceManager}
* operation.
* @param stashedBy the build that it belongs to.
*/
public StashInfo(StashResult result, String stashedBy) {
this.stashedBy = stashedBy;
this.type = StashType.INTERNAL;
this.key = result.getKey();
this.lease = result.getLease();
}
@Override
public StashInfo clone() throws CloneNotSupportedException {
StashInfo other = (StashInfo)super.clone();
if (this.lease != null) {
other.lease = this.lease.clone();
}
return other;
}
/**
* Exactly what stashed it. If {@link #getType()} is {@link StashType#INTERNAL} then this points to a build on the
* local Jenkins server.
*
* @return the name or something else.
*/
public String getStashedBy() {
return stashedBy;
}
/**
* General type info about what/who stashed the resource.
*
* @return the type.
*/
public StashType getType() {
return type;
}
/**
* Information about when the lease expires.
*
* @return the lease info.
*/
public Lease getLease() {
return lease;
}
/**
* The key to release or lock the resource.
*
* @return the key.
*/
public String getKey() {
return key;
}
/**
* If {@link #getType()} is internal or not. Added for simplified usage in jelly.
*
* @return true if so.
*/
public boolean isInternal() {
return getType() == StashType.INTERNAL;
}
/**
* Returns true if the stashedBy String is a valid URL.
*
* @return true if URL, false if not.
*/
public boolean stashedByIsURL() {
try {
URL url = new URL(getStashedBy());
return true;
} catch (MalformedURLException e) {
return false;
}
}
/**
* Returns a JSON representation of this object.
*
* @return the object in JSON format.
*
* @see com.sonyericsson.jenkins.plugins.externalresource.dispatcher.data.ExternalResource#toJson()
* @see com.sonyericsson.jenkins.plugins.externalresource.dispatcher.data.Lease#toJson()
*/
public JSONObject toJson() {
JSONObject json = new JSONObject();
json.put(Constants.JSON_ATTR_STASHED_BY, stashedBy);
json.put(Constants.JSON_ATTR_TYPE, type.name());
if (lease != null) {
json.put(Constants.JSON_ATTR_LEASE, lease.toJson());
} else {
json.put(Constants.JSON_ATTR_LEASE, new JSONObject(true));
}
json.put(Constants.JSON_ATTR_KEY, key);
return json;
}
/**
* The general type of what stashed the resource.
*/
public static enum StashType {
/**
* The resource is stashed by Jenkins, so stashedBy should point to a build.
*/
INTERNAL,
/**
* The resource is stashed by something external, so stashed by points to something else.
*/
EXTERNAL
}
}