/*******************************************************************************
* Copyright (c) 2017 PDT Extension Group and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* PDT Extension Group - initial API and implementation
* Kaloyan Raev - [501269] externalize strings
*******************************************************************************/
package org.eclipse.php.composer.api.collection;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.*;
import java.util.Map.Entry;
import org.eclipse.php.composer.api.entities.AbstractJsonObject;
import org.eclipse.php.composer.api.json.ParseException;
import org.eclipse.php.composer.api.objects.Script;
import org.eclipse.php.composer.api.objects.Script.HandlerValue;
/**
* Represents a scripts entity in a composer package.
*/
public class Scripts extends AbstractJsonObject<Script> implements Iterable<Script> {
public static String[] getEvents() {
return new String[] { "pre-install-cmd", "post-install-cmd", "pre-update-cmd", "post-update-cmd", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
"pre-package-install", "post-package-install", "pre-package-update", "post-package-update", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
"pre-package-uninstall", "post-package-uninstall" }; //$NON-NLS-1$ //$NON-NLS-2$
}
private transient PropertyChangeListener listener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
firePropertyChange(evt.getPropertyName(), evt.getOldValue(), evt.getNewValue());
}
};
public Scripts() {
}
public Scripts(String json) throws ParseException {
fromJson(json);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
protected void doParse(Object obj) {
clear();
if (obj instanceof LinkedHashMap) {
LinkedHashMap json = (LinkedHashMap) obj;
for (Entry<String, Object> entry : ((Map<String, Object>) json).entrySet()) {
Script script = new Script();
script.setScript(entry.getKey());
if (entry.getValue() instanceof LinkedList) {
for (Object handler : (LinkedList) entry.getValue()) {
script.add(new HandlerValue((String) handler));
}
} else {
script.add(new HandlerValue((String) entry.getValue()));
}
add(script);
}
}
}
@Override
protected Object buildJson() {
LinkedHashMap<String, Object> out = new LinkedHashMap<String, Object>();
for (Script script : this) {
Object value = ""; //$NON-NLS-1$
if (script.size() > 1) {
value = script.getHandlersJsonValue();
} else if (script.size() == 1) {
value = script.getFirst().getAsString();
}
out.put(script.getScript(), value);
}
return out;
}
/**
* Adds a new dependency.
*
* @param dependency
* the new dependency
* @return this
*/
public void add(Script script) {
if (has(script)) {
get(script.getScript()).addHandlers(script);
} else {
script.addPropertyChangeListener(listener);
set(script.getScript(), script);
}
}
/**
* Removes a dependency.
*
* @param dependency
* the dependency to remove
*/
public void remove(Script script) {
script.removePropertyChangeListener(listener);
super.remove(script.getScript());
}
public Collection<Script> getScripts() {
return properties.values();
}
public Iterator<Script> iterator() {
return (Iterator<Script>) properties.values().iterator();
}
public Script getFirst() {
if (properties.values().iterator().hasNext()) {
return properties.values().iterator().next();
}
return null;
}
public int size() {
return properties.keySet().size();
}
public boolean has(String script) {
return properties.containsKey(script);
}
public boolean has(Script script) {
return has(script.getScript());
}
public boolean hasHandler(String handler) {
throw new UnsupportedOperationException();
}
/**
* Returns the script for a given handler or null if the handler isn't found
*
* @param handler
* the handler
* @return the related script
*/
public Script getScriptForHandler(String handler) {
for (Script script : properties.values()) {
if (script.has(handler)) {
return script;
}
}
return null;
}
}