package org.openflexo.ws.jira.model;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JIRAIssue extends JIRAObject<JIRAIssue> {
/**
*
*/
private static final long serialVersionUID = 5078675682772647794L;
public static class IssueType extends JIRAObject<IssueType> {
public static final String STACKTRACE_FIELD = "customfield_10000";
public static final String SYSTEM_PROPERTIES_FIELD = "customfield_10001";
/**
*
*/
private static final long serialVersionUID = -4127968691089024145L;
private String name;
private Boolean subtask;
private String iconUrl;
private String description;
private Map<String, JIRAField> fields;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean isSubtask() {
return subtask;
}
public void setSubtask(Boolean subtask) {
this.subtask = subtask;
}
public String getIconUrl() {
return iconUrl;
}
public void setIconUrl(String iconUrl) {
this.iconUrl = iconUrl;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Map<String, JIRAField> getFields() {
return fields;
}
public void setFields(Map<String, JIRAField> fields) {
this.fields = fields;
}
public JIRAField<JIRAPriority> getPriorityField() {
if (getFields() != null) {
try {
JIRAField<?> jiraField = getFields().get("priority");
if (jiraField != null) {
return jiraField.mutateToFieldOfType(JIRAPriority.class);
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
public JIRAField<JIRAVersion> getVersionField() {
if (getFields() != null) {
try {
JIRAField<?> jiraField = getFields().get("versions");
if (jiraField != null) {
return jiraField.mutateToFieldOfType(JIRAVersion.class);
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
public JIRAField<JIRAComponent> getComponentField() {
if (getFields() != null) {
try {
JIRAField<?> jiraField = getFields().get("components");
if (jiraField != null) {
return jiraField.mutateToFieldOfType(JIRAComponent.class);
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
public boolean hasStacktraceField() {
return getFields() != null && getFields().get(STACKTRACE_FIELD) != null;
}
public boolean hasSystemPropertiesField() {
return getFields() != null && getFields().get(SYSTEM_PROPERTIES_FIELD) != null;
}
}
private JIRAProject project;
private String summary;
private String description;
private IssueType issuetype;
private List<JIRAVersion> versions;
private JIRAPriority priority;
private List<JIRAComponent> components;
private transient boolean membersHaveBeenReplaced;
public JIRAProject getProject() {
return project;
}
public void setProject(JIRAProject project) {
this.project = project;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public IssueType getIssuetype() {
return issuetype;
}
public void setIssuetype(IssueType issuetype) {
this.issuetype = issuetype;
}
public List<JIRAVersion> getVersions() {
return versions;
}
public void setVersions(List<JIRAVersion> versions) {
this.versions = versions;
}
public JIRAVersion getVersion() {
if (versions != null && versions.size() > 0) {
return versions.get(0);
} else {
return null;
}
}
public void setVersion(JIRAVersion version) {
if (version != null) {
setVersions(Arrays.asList(version));
} else {
setVersions(null);
}
}
public List<JIRAComponent> getComponents() {
return components;
}
public void setComponents(List<JIRAComponent> components) {
this.components = components;
}
public JIRAComponent getComponent() {
if (components != null && components.size() > 0) {
return components.get(0);
} else {
return null;
}
}
public void setComponent(JIRAComponent component) {
if (component != null) {
setComponents(Arrays.asList(component));
} else {
setComponents(null);
}
}
public JIRAPriority getPriority() {
return priority;
}
public void setPriority(JIRAPriority priority) {
this.priority = priority;
}
public <J extends JIRAObject<J>> void replaceMembersByIdentityMembers() {
Class<?> klass = getClass();
while (klass != null) {
for (Field field : klass.getDeclaredFields()) {
if (JIRAObject.class.isAssignableFrom(field.getType())) {
field.setAccessible(true);
try {
J object = (J) field.get(this);
if (object != null) {
field.set(this, object.getAsIdentityObject());
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if (List.class.isAssignableFrom(field.getType())
&& field.getGenericType() instanceof ParameterizedType
&& ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0] instanceof Class
&& JIRAObject.class.isAssignableFrom((Class<?>) ((ParameterizedType) field.getGenericType())
.getActualTypeArguments()[0])) {
field.setAccessible(true);
try {
List<J> list = (List<J>) field.get(this);
if (list != null) {
List<J> newList = new ArrayList<J>();
for (J j : list) {
newList.add(j.getAsIdentityObject());
}
field.set(this, newList);
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
klass = klass.getSuperclass();
}
membersHaveBeenReplaced = true;
}
public <J extends JIRAObject<J>> void replaceMembersByOriginalMembers() {
if (!membersHaveBeenReplaced) {
return;
}
Class<?> klass = getClass();
while (klass != null) {
for (Field field : klass.getDeclaredFields()) {
if (JIRAObject.class.isAssignableFrom(field.getType())) {
field.setAccessible(true);
try {
J object = (J) field.get(this);
if (object != null) {
field.set(this, object.restoreObject());
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if (List.class.isAssignableFrom(field.getType())
&& field.getGenericType() instanceof ParameterizedType
&& JIRAObject.class.isAssignableFrom(((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]
.getClass())) {
field.setAccessible(true);
try {
List<J> list = (List<J>) field.get(this);
if (list != null) {
List<J> newList = new ArrayList<J>();
for (J j : list) {
newList.add(j.restoreObject());
}
field.set(this, newList);
}
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
klass = klass.getSuperclass();
}
membersHaveBeenReplaced = false;
}
public void makeValid() {
if (getIssuetype() != null) {
Class<?> klass = getClass();
while (klass != HashMap.class) {
for (Field field : klass.getDeclaredFields()) {
if (!getIssuetype().getFields().containsKey(field.getName())) {
if (Modifier.isFinal(field.getModifiers()) || Modifier.isStatic(field.getModifiers())
|| Modifier.isTransient(field.getModifiers())) {
continue;
}
field.setAccessible(true);
try {
field.set(this, null);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
klass = klass.getSuperclass();
}
for (Map.Entry<String, Object> e : new HashMap<String, Object>(this).entrySet()) {
if (!getIssuetype().getFields().containsKey(e.getKey())) {
this.remove(e.getKey());
}
}
}
}
public String getStacktrace() {
return (String) get(IssueType.STACKTRACE_FIELD);
}
public void setStacktrace(String stacktrace) {
put(IssueType.STACKTRACE_FIELD, stacktrace);
}
public String getSystemProperties() {
return (String) get(IssueType.SYSTEM_PROPERTIES_FIELD);
}
public void setSystemProperties(String systemProperties) {
put(IssueType.SYSTEM_PROPERTIES_FIELD, systemProperties);
}
}