package com.idega.event;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.idega.core.component.data.ICObjectInstance;
import com.idega.idegaweb.IWLocation;
import com.idega.idegaweb.IWMainApplication;
import com.idega.presentation.EventViewerPage;
import com.idega.presentation.IWContext;
import com.idega.presentation.Page;
import com.idega.presentation.PresentationObject;
import com.idega.presentation.ui.Parameter;
import com.idega.repository.data.RefactorClassRegistry;
import com.idega.util.ArrayUtil;
/**
* <p>Title: idegaWeb</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2001</p>
* <p>Company: idega Software</p>
* @author <a href="gummi@idega.is">Gu�mundur �g�st S�mundsson</a>
* @version 1.0
*/
public abstract class IWPresentationEvent extends EventObject implements Cloneable {
private static final long serialVersionUID = 3008125680698742615L;
public final static String PRM_IW_EVENT = "iw_event_type";
public final static String PRM_IW_EVENT_SOURCE = "iw_ev_src";
private static String IW_EVENT_HANDLER_SERVLET_URL = "/servlet/IWEventHandler";
private String eventHandlerURL = null;
public static String DEFAULT_IW_EVENT_TARGET="iw_event_frame";
private String eventTarget = null;
private static final Logger LOGGER = Logger.getLogger(IWPresentationEvent.class.getName());
/**
*
* @uml.property name="_parameters"
* @uml.associationEnd multiplicity="(0 -1)" elementType="com.idega.presentation.ui.Parameter"
*/
private List<Parameter> _parameters = new ArrayList<Parameter>();
/**
*
* @uml.property name="_page"
* @uml.associationEnd multiplicity="(0 1)"
*/
private Page _page = null;
/**
*
* @uml.property name="_iwc"
* @uml.associationEnd multiplicity="(0 1)"
*/
private IWContext _iwc = null;
private String sourceParameterValue = null;
public IWPresentationEvent(){
this(PresentationObject.NULL_CLONE_OBJECT);
}
public void setIWContext(IWContext iwc){
this._iwc = iwc;
}
public IWContext getIWContext(){
return this._iwc;
}
public Page getPage(){
return this._page;
}
public void setPage(Page page){
this._page = page;
}
public boolean containsParameter(Parameter prm){
return this._parameters.contains(prm);
}
public IWPresentationEvent(PresentationObject source){
super(source);
initializeVariables();
this.addParameter(PRM_IW_EVENT, IWMainApplication.getEncryptedClassName(this.getClass()));
}
public IWPresentationEvent(IWContext iwc) throws NoSuchEventException{
this();
boolean ok = this.initializeEvent(iwc);
if(!ok){
NoSuchEventException ex = new NoSuchEventException("No Event of type: " + this.getClass().getName());
throw ex;
}
}
public void initializeVariables(){
}
public void setSource(PresentationObject source) {
setSource(source.getCompoundId());
/* if(source.getICObjectInstanceID() > 0){
setSource(source.getICObjectInstanceID());
} else if(source.getLocation() != null){
setSource(source.getLocation());
}
//this.source = source;*/
}
public String getSourceParameterValue() {
return this.sourceParameterValue;
}
public void setSource(IWLocation source) {
this.sourceParameterValue = source.getLocationString();
this.addParameter(PRM_IW_EVENT_SOURCE, this.sourceParameterValue);
}
public void setSource(int instanceId) {
this.sourceParameterValue = Integer.toString(instanceId);
this.addParameter(PRM_IW_EVENT_SOURCE, this.sourceParameterValue);
}
public void setSource(ICObjectInstance instance) throws RemoteException {
this.sourceParameterValue = ((Integer)instance.getPrimaryKey()).toString();
this.addParameter(PRM_IW_EVENT_SOURCE, this.sourceParameterValue);
}
public void setSource(String compoundId) {
this.sourceParameterValue = compoundId;
this.addParameter(PRM_IW_EVENT_SOURCE, this.sourceParameterValue);
}
// public IWPresentationEvent(PresentationObject source) {
// this();
// setSource(source);
// }
//
// public void setSource(PresentationObject source){
// if(source.getICObjectInstanceID() > 0){
// this.addParameter(PRM_EVENT_SOURCE, Integer.toString(source.getICObjectInstanceID()));
// } else {
//
// }
// }
protected void addParameter(String prmName, String value){
Parameter prm = new Parameter(prmName,value);
this.addParameter(prm);
}
protected void addParameter(String prmName, int value){
Parameter prm = new Parameter(prmName,Integer.toString(value));
this.addParameter(prm);
}
protected void addParameter(Parameter prm){
this._parameters.add(prm);
}
public Iterator<Parameter> getParameters(){
return this._parameters.iterator();
}
public abstract boolean initializeEvent(IWContext iwc);
@SuppressWarnings("unchecked")
@Override
public Object clone() {
IWPresentationEvent model = null;
try {
model = (IWPresentationEvent) super.clone();
if (this._parameters != null) {
model._parameters = (List<Parameter>) ((ArrayList<Parameter>) this._parameters).clone();
} else {
model._parameters = new ArrayList<Parameter>();
}
} catch (CloneNotSupportedException ex) {
ex.printStackTrace(System.err);
}
return model;
}
public static IWPresentationEvent[] getCurrentEvents(IWContext iwc){
String[] classNames = iwc.getParameterValues(PRM_IW_EVENT);
if (ArrayUtil.isEmpty(classNames)) {
return new IWPresentationEvent[0];
}
IWPresentationEvent[] events = new IWPresentationEvent[classNames.length];
int index = 0;
for (int i = 0; i < classNames.length; i++) {
String className = IWMainApplication.decryptClassName(classNames[i]);
boolean ok = false;
IWPresentationEvent event = null;
try {
event = (IWPresentationEvent) RefactorClassRegistry.forName(className).newInstance();
ok = event.initializeEvent(iwc);
} catch(ClassCastException cce) {
ok = false;
LOGGER.log(Level.WARNING, "IWPresentationEvent ClassCastException for :"+className , cce);
} catch(ClassNotFoundException cnfe) {
ok = false;
LOGGER.log(Level.WARNING, "IWPresentationEvent ClassCastException for :"+className, cnfe);
} catch(IllegalAccessException iae) {
ok = false;
LOGGER.log(Level.WARNING, "IWPresentationEvent IllegalAccessException for :"+className, iae);
} catch(InstantiationException ie) {
ok = false;
LOGGER.log(Level.WARNING, "IWPresentationEvent InstantiationException for :"+className, ie);
}
if (ok) {
events[index++] = event;
}
}
if (index < classNames.length) {
IWPresentationEvent[] newEvents = new IWPresentationEvent[index];
System.arraycopy(events,0,newEvents,0,index);
return newEvents;
} else {
return events;
}
}
public static boolean anyEvents(IWContext iwc){
return (iwc.getParameter(PRM_IW_EVENT) != null);
}
public static Object getSource(IWContext iwc){
String sourceString = iwc.getParameter(PRM_IW_EVENT_SOURCE);
// try {
// Integer primaryKey = new Integer(sourceString);
// ICObjectInstance instance = (ICObjectInstance)IDOLookup.findByPrimaryKey(ICObjectInstance.class,primaryKey);
// return instance;
// return primaryKey;
//}
//catch (NumberFormatException ex) {
// Source is location
//}
// catch (RemoteException rex) {
// throw new RuntimeException(rex.getMessage());
// }
// catch (FinderException fe) {
// throw new RuntimeException(fe.getMessage());
// }
return sourceString;
//return IWPresentationLocation.getLocationObject(sourceString);
}
/**
* Returns the eventHandlerURL.
* @return String
*/
public String getEventHandlerURL(IWContext iwc) {
if (this.eventHandlerURL == null) {
this.eventHandlerURL = getEventHandlerFrameURL(iwc);
}
return this.eventHandlerURL;
}
/**
* Returns the URL to the Event handling frame prefixed with the servlet context path if any.
* @return String
*/
public static String getEventHandlerFrameURL(IWContext iwc) {
if (IWMainApplication.useNewURLScheme) {
return iwc.getIWMainApplication().getWindowOpenerURI(EventViewerPage.class);
} else {
return iwc.getIWMainApplication().getTranslatedURIWithContext(IW_EVENT_HANDLER_SERVLET_URL);
}
}
/**
* Sets the eventHandlerURL.
* @param eventHandlerURL The eventHandlerURL to set
*
* @uml.property name="eventHandlerURL"
*/
public void setEventHandlerURL(String eventHandlerURL) {
this.eventHandlerURL = eventHandlerURL;
}
/**
* Returns the eventTarget.
* @return String
*
* @uml.property name="eventTarget"
*/
public String getEventTarget() {
if (this.eventTarget == null) {
this.eventTarget = DEFAULT_IW_EVENT_TARGET;
}
return this.eventTarget;
}
/**
* Sets the eventTarget.
* @param eventTarget The eventTarget to set
*
* @uml.property name="eventTarget"
*/
public void setEventTarget(String eventTarget) {
this.eventTarget = eventTarget;
}
}