Finished implementing requirements from FAO for writing back to the VME-DB, connected to the export service of RSG (without success)

git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/user/reports@90453 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Massimiliano Assante 2014-01-23 18:11:55 +00:00
parent 4830e2830f
commit 0aa2cbd1cc
16 changed files with 217 additions and 61 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/reports-4.7.1-SNAPSHOT/WEB-INF/classes" path="src/main/java">
<classpathentry kind="src" output="target/reports-4.7.2-SNAPSHOT/WEB-INF/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
@ -26,10 +26,10 @@
</attributes>
</classpathentry>
<classpathentry kind="con" path="com.google.gwt.eclipse.core.GWT_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/reports-4.7.1-SNAPSHOT/WEB-INF/classes"/>
<classpathentry kind="output" path="target/reports-4.7.2-SNAPSHOT/WEB-INF/classes"/>
</classpath>

View File

@ -2,6 +2,6 @@
<<<<<<<=.mine
>>>>>>>=.r71295
eclipse.preferences.version=1
lastWarOutDir=/Users/massi/Documents/workspace/reports/target/reports-4.7.1-SNAPSHOT
lastWarOutDir=/Users/massi/Documents/workspace/reports/target/reports-4.7.2-SNAPSHOT
warSrcDir=src/main/webapp
warSrcDirIsOutput=false

View File

@ -1,8 +1,8 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.6
org.eclipse.jdt.core.compiler.source=1.7

View File

@ -3,5 +3,5 @@
<fixed facet="wst.jsdt.web"/>
<installed facet="wst.jsdt.web" version="1.0"/>
<installed facet="jst.web" version="2.4"/>
<installed facet="java" version="1.6"/>
<installed facet="java" version="1.7"/>
</faceted-project>

View File

@ -12,7 +12,7 @@
<groupId>org.gcube.portlets.user</groupId>
<artifactId>reports</artifactId>
<packaging>war</packaging>
<version>4.7.1-SNAPSHOT</version>
<version>4.7.2-SNAPSHOT</version>
<name>gCube Reports Manager</name>
<description>
gCube Reports Portlet.
@ -281,8 +281,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<!-- SA Plugin -->

View File

@ -29,6 +29,10 @@ import com.google.gwt.user.client.ui.PopupPanel;
* @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it
*/
public class CommonCommands {
/**
*
*/
public Command exportToRSG;
/**
*
*/
@ -229,6 +233,12 @@ public class CommonCommands {
saveReportAsDialog();
}
};
exportToRSG = new Command() {
public void execute() {
presenter.exportReportToRSG();
}
};
} //end constructor

View File

@ -419,6 +419,7 @@ public class Presenter {
toReturn.put("structureView", commonCommands.structureView);
toReturn.put("save", commonCommands.saveTemplate);
toReturn.put("exportRSG", commonCommands.exportToRSG);
toReturn.put("newdoc", commonCommands.newTemplate);
toReturn.put("open_report", commonCommands.openReport);
toReturn.put("open_template", commonCommands.openTemplate);
@ -523,7 +524,26 @@ public class Presenter {
}
/**
* Save the current report in a given folder
*
*/
public void exportReportToRSG() {
dlg.center();
dlg.show();
Model toSave = model.getSerializableModel();
reportService.exportReportToRSG(toSave, new AsyncCallback<Void>() {
public void onFailure(Throwable caught) {
dlg.hide();
MessageBox.alert("Warning","Report Not Exported: " + caught.getMessage(), null);
}
public void onSuccess(Void result) {
dlg.hide();
MessageBox.info("Exporting to RSG Operation","Report Exported Successfully", null);
refreshWorkspace();
}
});
}
/**
* Save the current report in a given folder
*

View File

@ -85,6 +85,11 @@ public interface ReportService extends RemoteService{
*/
void saveReport(Model toSave);
/**
* @param toSave the report instance to save
*/
void exportReportToRSG(Model toSave);
Model getWorkflowDocumentFromDocumentLibrary();
void updateWorkflowDocument(Model toSave, boolean update);

View File

@ -86,4 +86,5 @@ public interface ReportServiceAsync {
void getVMEReportRef2Associate(String id, VMETypeIdentifier refType, AsyncCallback<Model> callback);
void importVMETemplate(VMETypeIdentifier refType,
AsyncCallback<Model> callback);
void exportReportToRSG(Model toSave, AsyncCallback<Void> callback);
}

View File

@ -386,6 +386,7 @@ public class TemplateComponent {
if (refs != null) {
ArrayList<Tuple> tuple = refs.getTuples();
ClientReportReference cmSeq = new ClientReportReference(presenter, refs.getRefType(), tuple, refs.isSingleRelation());
cmSeq.setMetadata(sc.getMetadata());
this.content = cmSeq;
} else
this.content = new HTML("");
@ -522,6 +523,7 @@ public class TemplateComponent {
break;
case REPORT_REFERENCE:
ClientReportReference cRef = (ClientReportReference) this.content;
metas = cRef.getMetadata();
ReportReferences ref = new ReportReferences(cRef.getRefType(), cRef.getTupleList(), cRef.isSingleRelation());
content = ref;
break;

View File

@ -7,9 +7,12 @@ import org.gcube.portlets.d4sreporting.common.shared.BasicComponent;
import org.gcube.portlets.d4sreporting.common.shared.ComponentType;
import org.gcube.portlets.d4sreporting.common.shared.Metadata;
import org.gcube.portlets.d4sreporting.common.shared.RepeatableSequence;
import org.gcube.portlets.d4sreporting.common.shared.ReportReferences;
import org.gcube.portlets.d4sreporting.common.shared.Tuple;
import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter;
import org.gcube.portlets.user.reportgenerator.client.model.TemplateComponent;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.VerticalPanel;
@ -35,7 +38,7 @@ public class ClientRepeatableSequence extends Composite implements ClientSequenc
this.originalSequence = extractOriginalSequence(sRS);
SequenceWidget seqW = new SequenceWidget(p, this, originalSequence, true, false);
myPanel.add(seqW);
for (RepeatableSequence repeatSeq : getRepeats()) {
addAnother(repeatSeq);
}
@ -86,7 +89,7 @@ public class ClientRepeatableSequence extends Composite implements ClientSequenc
if (repeatDelimiterCounter == 0) {
toReturn.add(new RepeatableSequence(groupedComponents, repSequence.getHeight()));
repeatDelimiterCounter = 2;
groupedComponents = new ArrayList<BasicComponent>();
groupedComponents = new ArrayList<BasicComponent>();
}
}
//if there is only the first sequence return nothing
@ -109,7 +112,7 @@ public class ClientRepeatableSequence extends Composite implements ClientSequenc
SequenceWidget seqW = new SequenceWidget(p, this, sRS, false, false);
myPanel.add(seqW);
}
protected void addNew(RepeatableSequence sRS) {
SequenceWidget seqW = new SequenceWidget(p, this, sRS, false, true);
@ -125,42 +128,98 @@ public class ClientRepeatableSequence extends Composite implements ClientSequenc
groupedComponents.remove(tc);
}
}
//TODO: change the -1 in the current max
/**
* add the template component in the model
*/
@Override
public void addTemplateComponent(TemplateComponent toAdd) {
groupedComponents.add(toAdd);
}
/**
* return the grouped components of a sequence. For the specific RSG case if it finds a @see {@link SequenceWidget} RSG_BINDING_PROPERTY
* with value -1 it update it to the max value so far (requirement for RSG needed to wrote back the report in the DB)
* Note that a Sequence can contain multiple sequences and they are separeted by componentType.REPEAT_SEQUENCE_DELIMITER
*/
@Override
public ArrayList<TemplateComponent> getGroupedComponents() {
return groupedComponents;
}
/**
* @return specific cor RSG Case search for binding="geoRefList[3]"
*/
private int getMaxIndex() {
int max = 0;
for (TemplateComponent co : groupedComponents) {
for (Metadata prop : co.getAllMetadata()) {
if (prop.getAttribute().equals(SequenceWidget.RSG_BINDING_PROPERTY)) {
int currValue = extractIndexFromBindingContext(prop.getValue());
if (currValue > max)
max = currValue;
int maxBindingContext = getMaxIndex();
for (int i = 0; i < groupedComponents.size(); i++) {
TemplateComponent co = groupedComponents.get(i);
if (co.getType() == ComponentType.REPEAT_SEQUENCE_DELIMITER) {
maxBindingContext++;
}
//specific for report References in Sequences
if (co.getType() == ComponentType.REPORT_REFERENCE) {
GWT.log("Reference found");
ClientReportReference refGroup = (ClientReportReference) co.getContent();
if (refGroup != null) {
for (Metadata prop : refGroup.getMetadata()) {
GWT.log("-" + prop.getAttribute()+":"+prop.getValue());
//if there's a new component
if ( prop.getAttribute().equals(SequenceWidget.RSG_BINDING_PROPERTY) && (extractIndexFromBindingContext(prop.getValue()) == -1) ) {
prop.setValue(replaceIndexFromBindingContext(prop.getValue(), maxBindingContext));
break;
}
}
//GWT.log("-" + prop.getAttribute()+":"+prop.getValue());
}
}
//for any other component
for (Metadata prop : co.getAllMetadata()) {
//if there's a new component
if ( prop.getAttribute().equals(SequenceWidget.RSG_BINDING_PROPERTY) && (extractIndexFromBindingContext(prop.getValue()) == -1) ) {
prop.setValue(replaceIndexFromBindingContext(prop.getValue(), maxBindingContext));
break;
}
}
}
return max;
return groupedComponents;
}
/**
*
* @param binding it expect sth like #.profileList[0] or #.specificMeasureList[0] etc
* and return the integer into square brackets
* @return the integer into square brackets
*/
private int extractIndexFromBindingContext(String binding) {
int openSquareBracket = binding.lastIndexOf("[")+1;
int closeSquareBracket = binding.lastIndexOf("]");
return Integer.parseInt(binding.substring(openSquareBracket, closeSquareBracket));
}
/**
*
* @param binding it expect sth like #.profileList[0] or #.specificMeasureList[0] etc
* @param newIndex
* @return return the newIndex into square brackets
*/
private String replaceIndexFromBindingContext(String binding, int newIndex) {
int openSquareBracket = binding.lastIndexOf("[")+1;
int closeSquareBracket = binding.lastIndexOf("]");
String toReturn = binding.substring(0, openSquareBracket) + newIndex + binding.substring(closeSquareBracket);
return toReturn;
}
/**
* @return specific cor RSG Case search for binding="geoRefList[3]" and return the max number into the square brackets
*/
private int getMaxIndex() {
int max = 0;
for (TemplateComponent co : groupedComponents) {
for (Metadata prop : co.getAllMetadata()) {
if (prop.getAttribute().equals(SequenceWidget.RSG_BINDING_PROPERTY)) {
int currValue = extractIndexFromBindingContext(prop.getValue());
if (currValue > max)
max = currValue;
}
}
}
GWT.log("return max=" +max);
return max;
}
public void setGroupedComponents(ArrayList<TemplateComponent> groupedComponents) {
this.groupedComponents = groupedComponents;
}
@ -196,7 +255,9 @@ public class ClientRepeatableSequence extends Composite implements ClientSequenc
public void setMetadata(List<Metadata> metas) {
this.metas = metas;
}
}
}

View File

@ -1,9 +1,11 @@
package org.gcube.portlets.user.reportgenerator.client.targets;
import java.util.ArrayList;
import java.util.List;
import org.gcube.portlets.d4sreporting.common.shared.BasicComponent;
import org.gcube.portlets.d4sreporting.common.shared.ComponentType;
import org.gcube.portlets.d4sreporting.common.shared.Metadata;
import org.gcube.portlets.d4sreporting.common.shared.RepeatableSequence;
import org.gcube.portlets.d4sreporting.common.shared.Tuple;
import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter;
@ -20,10 +22,10 @@ import com.google.gwt.user.client.ui.VerticalPanel;
* @author massi
*
*/
public class ClientReportReference extends Composite implements ClientSequence {
public class ClientReportReference extends Composite implements ClientSequence, Cloneable {
private final int indentationValue = 20;
private List<Metadata> metas;
protected ArrayList<TemplateComponent> groupedComponents = new ArrayList<TemplateComponent>();
private VerticalPanel myPanel = new VerticalPanel();
@ -109,6 +111,14 @@ public class ClientReportReference extends Composite implements ClientSequence {
return singleRelation;
}
/**
* add the template component in the model
*/
@Override
public void addTemplateComponent(TemplateComponent toAdd) {
groupedComponents.add(toAdd);
}
@Override
public ArrayList<TemplateComponent> getGroupedComponents() {
return groupedComponents;
@ -178,7 +188,7 @@ public class ClientReportReference extends Composite implements ClientSequence {
}
/**
* A Ref is a seqeunce with diffrent style (intendedm white background and less wide)
* A Ref is a seqeunce with diffrent style (indented, white background and less wide)
*
*/
private SequenceWidget getRefSequence(Presenter p, ClientSequence owner, RepeatableSequence repSequence, boolean notRemovable, boolean isNew) {
@ -188,4 +198,12 @@ public class ClientReportReference extends Composite implements ClientSequence {
toReturn.alignButtonsLeft();
return toReturn;
}
public List<Metadata> getMetadata() {
return metas;
}
public void setMetadata(List<Metadata> metas) {
this.metas = metas;
}
}

View File

@ -8,6 +8,8 @@ import org.gcube.portlets.user.reportgenerator.client.model.TemplateComponent;
public interface ClientSequence {
ArrayList<TemplateComponent> getGroupedComponents();
void addTemplateComponent(TemplateComponent toAdd);
boolean add(String id, RepeatableSequence sequence, boolean isSingleRelation);

View File

@ -7,6 +7,7 @@ import org.gcube.portlets.d4sreporting.common.shared.BasicComponent;
import org.gcube.portlets.d4sreporting.common.shared.ComponentType;
import org.gcube.portlets.d4sreporting.common.shared.Metadata;
import org.gcube.portlets.d4sreporting.common.shared.RepeatableSequence;
import org.gcube.portlets.d4sreporting.common.shared.Tuple;
import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter;
import org.gcube.portlets.user.reportgenerator.client.model.TemplateComponent;
@ -72,10 +73,23 @@ public class SequenceWidget extends Composite {
sComp.setPossibleContent("");
sComp.setMetadata(setPropertiesForRSG(sComp.getMetadata()));
}
TemplateComponent toAdd = new TemplateComponent(p.getModel(), sComp, p, false, null);
if (isNew && sComp.getType() == ComponentType.REPORT_REFERENCE ) { //when adding a new Sequence blanks the Ref
ClientReportReference cRef = (ClientReportReference) toAdd.getContent();
cRef.clear();
//need to clone the Tuple otherwise when blanking the ref it blanks the source too
ArrayList<Tuple> clonedTuples = new ArrayList<Tuple>();
for (Tuple tuple : cRef.getTupleList()) {
Tuple clonedTuple = tuple.clone();
clonedTuple.setKey("-1");
clonedTuples.add(clonedTuple);
}
ClientReportReference clonedRef = new ClientReportReference(p, cRef.getRefType(), clonedTuples, cRef.isSingleRelation());
clonedRef.setMetadata(setPropertiesForRSG(sComp.getMetadata())); //copy the metadata and signal is new
toAdd.setContent(clonedRef);
clonedRef.clear();
}
add(toAdd);
@ -126,6 +140,7 @@ public class SequenceWidget extends Composite {
private List<Metadata> setPropertiesForRSG(List<Metadata> properties) {
List<Metadata> toReturn = new ArrayList<Metadata>();
//cloning metadata
for (Metadata metadata : properties) {
Metadata toAdd = new Metadata(metadata.getAttribute(), metadata.getValue());
toReturn.add(toAdd);
@ -177,10 +192,10 @@ public class SequenceWidget extends Composite {
buttonsWrapperPanel.insert(clearB, 0);
}
//TODO:
public void clearAssociation() {
GWT.log("Clearing Association");
GWT.log("Clearing Association");
//in the MODEL leave only the delimiters
ArrayList<BasicComponent> cleanedRef = new ArrayList<BasicComponent>();
for (BasicComponent bc : repSequence.getGroupedComponents()) {
@ -219,7 +234,7 @@ public class SequenceWidget extends Composite {
public void add(TemplateComponent toAdd) {
if (toAdd.getType() != ComponentType.REPEAT_SEQUENCE_INNER) {
owner.getGroupedComponents().add(toAdd);
owner.addTemplateComponent(toAdd);
seqGroupedComponents.add(toAdd);
myPanel.add(toAdd.getContent());
}

View File

@ -78,7 +78,12 @@ public class RichTextToolbar extends Composite {
} else if (sender == save) {
//call the command of Templates or Reports
commands.get("save").execute();
} else if (sender == newdoc) {
}
else if (sender == saveDB) {
//call the command toExport to RSG the current instance of the model
commands.get("exportRSG").execute();
}
else if (sender == newdoc) {
commands.get("newdoc").execute();
}else if (sender == structureView) {
commands.get("structureView").execute();
@ -255,13 +260,7 @@ public class RichTextToolbar extends Composite {
//add the close button
topPanel.add(close = createPushButton(images.closeDoc(), strings.close_report()));
if (isVme) {
topPanel.add(saveDB = createPushButton(images.db_save(), "Commit current in VME-DB"));
saveDB.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Window.alert("Not currently available");
}
});
topPanel.add(saveDB = createPushButton(images.db_save(), "Commit current in VME-DB")); //TODO:
}
if (! isVme) {
@ -437,6 +436,7 @@ public class RichTextToolbar extends Composite {
public void enableCommands(boolean enable) {
open_report.setEnabled(enable);
save.setEnabled(enable);
if (newdoc != null) {
newdoc.setEnabled(enable);
open_template.setEnabled(enable);

View File

@ -558,7 +558,7 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe
}
}
private String getRSGWSAddress() {
String addr = (String) getASLSession().getAttribute(RSG_WS_ADDRESS);
_log.trace("getRSGWSAddress: " + addr);
@ -812,19 +812,19 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe
saveReport(toSave, folderid, itemName);
}
/**
* @param save a report in another folder .
*
*/
public void saveReport(Model toSave, String folderid, String newname) {
Model model = toSave;
ModelReader reader = new ModelReader(model);
System.out.println(reader);
storeTemplateInSession(toSave);
_log.info("Serializing Model in folder: " + folderid );
_log.info("Trying to convert dynamic images ... ");
@ -1165,9 +1165,9 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe
getASLSession().setAttribute(WfDocsLibrary.WORKFLOW_READONLY_ATTRIBUTE, true);
return new SessionInfo(getUserBean(), getVreName(), true, true, false);
}
boolean isVME = isReportsStoreGatewayAvailable();
if (getASLSession().getAttribute(WfDocsLibrary.WORKFLOW_ID_ATTRIBUTE) == null) {
_log.debug("WfDocsLibrary.WORKFLOW_ID_ATTRIBUTE is NULL: ");
return new SessionInfo(getUserBean(), getVreName(), false, false, isVME);
@ -1578,7 +1578,7 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe
}
return model;
}
@Override
public Model importVMETemplate(VMETypeIdentifier refType) {
RsgService rsgClient = new RsgClient(getRSGWSAddress());
@ -1604,6 +1604,26 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe
}
return model;
}
@Override
public void exportReportToRSG(Model model) {
RsgService rsgClient = new RsgClient(getRSGWSAddress());
//Use the RSG client to get a template for the report whose type is the last token (i.e. the corresponding class' 'simple name')
//appearing in the VME model class name as stored in the 'type' metadata
//If you're updating a 'report':
CompiledReport template = rsgClient.getTemplate(new ReportType(VMETypeIdentifier.Vme.getId()));
CompiledReport toSend = null;
try {
toSend = new ReportManagerReportBuilder().extract(template, model);
} catch (ReportBuilderException e) {
e.printStackTrace();
}
//Actual RSG client interface exposes different methods (publish / publishDelta etc.) that need to be updated
rsgClient.update(toSend);
}
/**
* this method look for a ReportsStoreGateway WS available in the infrastructure
* @return true if an instance of the ReportsStoreGateway is available in the infrastructure
@ -1635,5 +1655,7 @@ public class ReportServiceImpl extends RemoteServiceServlet implements ReportSe
else return false;
}
}