diff --git a/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/NewWebServiceAction.java b/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/NewWebServiceAction.java new file mode 100644 index 0000000..b6e5c05 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/NewWebServiceAction.java @@ -0,0 +1,36 @@ +package graphicalrefactor.actions; + +import java.awt.event.ActionEvent; +import graphicalrefactor.editor.Editor; +import graphicalrefactor.views.GraphicalRefactor; + +/**-------------------------------------------------------------------------------- + * this action's going to be called when you design of Web services. +/**-------------------------------------------------------------------------------- + * + */ +public class NewWebServiceAction extends AbstractSystemAction { + + /**-------------------------------------------------------------------------------- + * [constructor] + /**-------------------------------------------------------------------------------- + * + * @param frame + */ + public NewWebServiceAction(GraphicalRefactor frame) { + super("Create New Web Service", frame); + } + + /**-------------------------------------------------------------------------------- + * [public] + /**-------------------------------------------------------------------------------- + * + * @param e + */ + @Override + public void actionPerformed(ActionEvent e) { + frame.getEditor().clear(); + frame.setTitle(frame.title); + } + +} diff --git a/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/editor/WebServiceEditor.java b/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/editor/WebServiceEditor.java new file mode 100644 index 0000000..0c16bdd --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/editor/WebServiceEditor.java @@ -0,0 +1,205 @@ +package graphicalrefactor.editor; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Iterator; + +import com.mxgraph.model.mxGraphModel; +import com.mxgraph.view.mxCellState; +import com.mxgraph.view.mxGraph; +import com.mxgraph.view.mxGraphView; + +import algorithms.UpdateConflictCheck; +import models.dataConstraintModel.IdentifierTemplate; +import models.dataFlowModel.DataFlowModel; +import models.webServices.Service; +import models.webServices.WebServicesInfo; +import parser.ParserDTRAMForWebService; +import parser.exceptions.ExpectedAssignment; +import parser.exceptions.ExpectedChannel; +import parser.exceptions.ExpectedChannelName; +import parser.exceptions.ExpectedEquals; +import parser.exceptions.ExpectedFormulaChannel; +import parser.exceptions.ExpectedGeometry; +import parser.exceptions.ExpectedInOrOutOrRefKeyword; +import parser.exceptions.ExpectedIoChannel; +import parser.exceptions.ExpectedLeftCurlyBracket; +import parser.exceptions.ExpectedModel; +import parser.exceptions.ExpectedNode; +import parser.exceptions.ExpectedRHSExpression; +import parser.exceptions.ExpectedResource; +import parser.exceptions.ExpectedRightBracket; +import parser.exceptions.ExpectedStateTransition; +import parser.exceptions.WrongLHSExpression; +import parser.exceptions.WrongRHSExpression; +import parser.exceptions.webService.ExpectedBaseURL; +import parser.exceptions.webService.ExpectedResources; +import parser.exceptions.webService.ExpectedWebService; + +/**-------------------------------------------------------------------------------- + * this class is called when you design of Web services. +/**-------------------------------------------------------------------------------- + * + * @author k-fujii + */ +public class WebServiceEditor extends Editor{ + + private WebServicesInfo webServicesInfo = null; + + /**-------------------------------------------------------------------------------- + * [constructor] + /**-------------------------------------------------------------------------------- + * + * @param graph : the editor of generate prototype tool. + */ + public WebServiceEditor(final mxGraph graph) { + super(graph); + this.webServicesInfo = new WebServicesInfo(); + + } + + /**-------------------------------------------------------------------------------- + * [public] + /**-------------------------------------------------------------------------------- + /* open a file that has a ".dtram" extension. + * @param file + */ + @Override + public DataFlowModel open(final File file) { + String extension =""; + if(file != null && file.exists()) { + String name = file.getName(); + extension = name.substring(name.lastIndexOf(".")); + } + if(extension.contains(".model")) { + openModel(file); + } else { + try { + ParserDTRAMForWebService parser = new ParserDTRAMForWebService(new BufferedReader(new FileReader(file))); + try { + model = parser.doParseModel(); + graph = constructGraph(model); + + parser.doParseGeometry(graph); + parser.doParseWebService(this,model); + + curFilePath = file.getAbsolutePath(); + curFileName = file.getName(); + + if (!UpdateConflictCheck.run(model)) return null; + + updateResourceDependencyGraph(model); + + return model; + } catch (ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment + | ExpectedModel | ExpectedGeometry | ExpectedNode | ExpectedResource + | ExpectedFormulaChannel | ExpectedIoChannel + | ExpectedWebService | ExpectedBaseURL| ExpectedResources e) { + e.printStackTrace(); + } + }catch(FileNotFoundException e) { + e.printStackTrace(); + } + } + + return null; + } + + /**-------------------------------------------------------------------------------- + /* + * @param service + */ + @Override + public void save() { + // note: geometry の書き込みが消える. + // 1. ファイルの情報をキャッシュしてもう一度書き込む + // 2. 規定クラスでメソッド化して呼び出す. + if (curFilePath != null) { + try { + File file = new File(curFilePath); + String extension =""; + if(file != null && file.exists()) { + String name = file.getName(); + extension = name.substring(name.lastIndexOf(".")); + } + + if(extension.contains(".model")) saveModel(file); + else { + try (FileWriter filewriter = new FileWriter(file)) { + filewriter.write(toOutputString()); + filewriter.write("services {\n"); + + for(Service service : this.webServicesInfo.getServices()) { + filewriter.write("\tservice " + service.getName() + "{\n"); + filewriter.write("\t\tbaseURL:" + service.getBaseURL() +"\n"); + filewriter.write("\t\tresources:"); + + Object root = graph.getDefaultParent(); + for (int i = 0; i < graph.getModel().getChildCount(root); i++) { + Object cell = graph.getModel().getChildAt(root, i); + + if (graph.getModel().isVertex(cell)) { + mxGraphView view = graph.getView(); + mxCellState cellState = view.getState(cell); + + // get resource's name + for (Iterator itr = model.getIdentifierTemplates().iterator(); itr.hasNext();){ + IdentifierTemplate resource = itr.next(); + + if( !(resource instanceof IdentifierTemplate)) continue; + if( !cellState.getLabel().equals(resource.getResourceName())) continue; + + filewriter.write(resource.getResourceName()); + if(itr.hasNext()) filewriter.write(", "); + } + } + } + filewriter.write("\n\t}\n"); + } + // end loop + filewriter.write("}\n"); + filewriter.close(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + + /**-------------------------------------------------------------------------------- + * default + */ + private void constructWebServiceGraph() { + ((mxGraphModel)this.graph.getModel()).clear(); + + Object parent = graph.getDefaultParent(); + this.graph.getModel().beginUpdate(); + + try { + + } + finally { + this.graph.getModel().endUpdate(); + } + + } + + /**-------------------------------------------------------------------------------- + * setter + /**-------------------------------------------------------------------------------- + /** + * @param service + */ + public void addWebService(final Service service) { + this.webServicesInfo.addService(service); + } +} diff --git a/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/views/GraphicalRefactor.java b/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/views/GraphicalRefactor.java index ab035a5..e3e900d 100644 --- a/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/views/GraphicalRefactor.java +++ b/AlgebraicDataflowArchitectureModel/src/graphicalrefactor/views/GraphicalRefactor.java @@ -17,6 +17,7 @@ import com.mxgraph.view.mxGraph; import graphicalrefactor.editor.Editor; +import graphicalrefactor.editor.WebServiceEditor; public class GraphicalRefactor extends JFrame { private static final long serialVersionUID = -8690140317781055614L; @@ -43,7 +44,7 @@ } }; - editor = new Editor(graph); + editor = new WebServiceEditor(graph); graphComponent = new mxGraphComponent(graph) { protected mxICellEditor createCellEditor() { diff --git a/AlgebraicDataflowArchitectureModel/src/models/webServices/Service.java b/AlgebraicDataflowArchitectureModel/src/models/webServices/Service.java new file mode 100644 index 0000000..97d339b --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/models/webServices/Service.java @@ -0,0 +1,80 @@ +package models.webServices; + +import java.util.ArrayList; +import java.util.List; + +import models.dataConstraintModel.IdentifierTemplate; + +public class Service { + private String name = null; + private String baseURL = null; + private ArrayList identifireTemplates = null; + + /**-------------------------------------------------------------------------------- + * [Constructor] + /**-------------------------------------------------------------------------------- + * identifireTemplates are Empty + * + * @param name : it's Web services name. + */ + public Service(final String name, final String baseURL) { + this.name = name; + this.baseURL = baseURL; + this.identifireTemplates = new ArrayList<>(); + } + + /**-------------------------------------------------------------------------------- + * + * @param name : it's Web services name. + * @param identifierTemplates : the list of resources which formal model of DTRAM. + */ + public Service(final String name, final ArrayList identifierTemplates) { + this.name = name; + this.identifireTemplates = identifierTemplates; + } + + /**-------------------------------------------------------------------------------- + * Copy Constructor + * + * @param name : it's Web services name. + */ + private Service(final Service copy) { + this.name = copy.name; + this.baseURL = copy.baseURL; + this.identifireTemplates = copy.identifireTemplates; + } + + /**-------------------------------------------------------------------------------- + * [public] + /**-------------------------------------------------------------------------------- + * [getter] + * + * @return you'll get name of service. + */ + public String getName() { + return this.name; + } + + /**-------------------------------------------------------------------------------- + * @return you'll get services's baseURL + */ + public String getBaseURL() { + return this.baseURL; + } + + /**-------------------------------------------------------------------------------- + * @return you'll get list of an identifier template. + */ + public List getIdentifierTemplates(){ + return this.identifireTemplates; + } + + /**-------------------------------------------------------------------------------- + * add new to List + * + * @param identifierTemplate + */ + public void addIdentifireTemplate(final IdentifierTemplate identifierTemplate) { + this.identifireTemplates.add(identifierTemplate); + } +} diff --git a/AlgebraicDataflowArchitectureModel/src/models/webServices/WebServicesInfo.java b/AlgebraicDataflowArchitectureModel/src/models/webServices/WebServicesInfo.java new file mode 100644 index 0000000..4e9eeb6 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/models/webServices/WebServicesInfo.java @@ -0,0 +1,46 @@ +package models.webServices; + +import java.util.ArrayList; +import java.util.List; + +public class WebServicesInfo { + + private ArrayList services = null; + + /**-------------------------------------------------------------------------------- + * [Constructor] + /**-------------------------------------------------------------------------------- + * + */ + public WebServicesInfo() { + this.services = new ArrayList<>(); + } + + /**-------------------------------------------------------------------------------- + * copy constructor + */ + private WebServicesInfo(final WebServicesInfo webServicesInfo) { + this.services = webServicesInfo.services; + } + + + /**-------------------------------------------------------------------------------- + * [public] + /**-------------------------------------------------------------------------------- + * [getter] + * + * @return you'll get list of a service. + */ + public List getServices(){ + return this.services; + } + + /**-------------------------------------------------------------------------------- + * [setter] + * + * @param service + */ + public void addService(final Service service) { + this.services.add(service); + } +} diff --git a/AlgebraicDataflowArchitectureModel/src/parser/ParserDTRAMForWebService.java b/AlgebraicDataflowArchitectureModel/src/parser/ParserDTRAMForWebService.java new file mode 100644 index 0000000..38c4b1d --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/parser/ParserDTRAMForWebService.java @@ -0,0 +1,112 @@ +package parser; + +import java.io.BufferedReader; + +import graphicalrefactor.editor.WebServiceEditor; +import models.dataConstraintModel.IdentifierTemplate; +import models.dataFlowModel.DataFlowModel; +import models.webServices.Service; +import parser.exceptions.ExpectedAssignment; +import parser.exceptions.ExpectedLeftCurlyBracket; +import parser.exceptions.ExpectedRightBracket; +import parser.exceptions.webService.ExpectedBaseURL; +import parser.exceptions.webService.ExpectedResources; +import parser.exceptions.webService.ExpectedWebService; + +/**-------------------------------------------------------------------------------- + * This parser is selected, if somebody designs a web-service. + * @author k-Fujii + */ +public class ParserDTRAMForWebService extends ParserDTRAM { + + private static final String SERVICES_GROUP = "services"; + private static final String SERVICE_GROUP = "service"; + private static final String BASE_URL_OPTION = "baseURL"; + private static final String RESOURCES_OPTION = "resources"; + + /**-------------------------------------------------------------------------------- + * [constructor] + /**-------------------------------------------------------------------------------- + * + * @param reader + */ + public ParserDTRAMForWebService(final TokenStream stream) { + super(stream); + } + + /**-------------------------------------------------------------------------------- + * + * @param reader + */ + public ParserDTRAMForWebService(final BufferedReader reader) { + super(reader); + } + + /**-------------------------------------------------------------------------------- + * [public] + /**-------------------------------------------------------------------------------- + * execute to parse the DTRAM file. + * + * @param editor + * @param model + */ + public void doParseWebService(WebServiceEditor editor, DataFlowModel model) + throws + ExpectedWebService, ExpectedBaseURL, ExpectedResources, + ExpectedLeftCurlyBracket, ExpectedRightBracket, ExpectedAssignment + { + parseWebService(editor, model); + } + + /**-------------------------------------------------------------------------------- + * [private] + /**-------------------------------------------------------------------------------- + * parse to Web service's options in the DTRAM file. + * + * @param stream + */ + private void parseWebService(WebServiceEditor editor, DataFlowModel model) + throws + ExpectedWebService, ExpectedBaseURL, ExpectedResources, + ExpectedLeftCurlyBracket, ExpectedRightBracket, ExpectedAssignment + { + if (!isMatchKeyword(stream.next(), SERVICES_GROUP )) throw new ExpectedWebService(stream.getLine()); + if (!isMatchKeyword(stream.next(), LEFT_CURLY_BRACKET)) throw new ExpectedLeftCurlyBracket(stream.getLine()); + + String serviceTokenNode = stream.next(); + while (isMatchKeyword(serviceTokenNode, SERVICE_GROUP)) { + String serviceName = stream.next(); // it gets a service name here. + + if (!isMatchKeyword(stream.next(), LEFT_CURLY_BRACKET)) throw new ExpectedLeftCurlyBracket(stream.getLine()); + if (!isMatchKeyword(stream.next(), BASE_URL_OPTION)) throw new ExpectedBaseURL(stream.getLine()); + if (!isMatchKeyword(stream.next(), COLON)) throw new ExpectedAssignment(stream.getLine()); + + String baseURL = stream.next(); // it gets a service's base URL here. + + if (!isMatchKeyword(stream.next(), RESOURCES_OPTION)) throw new ExpectedResources(stream.getLine()); + if (!isMatchKeyword(stream.next(), COLON)) throw new ExpectedAssignment(stream.getLine()); + + // get specific resources from DataFlowModel. + Service service = new Service(serviceName, baseURL); + + while (true) { + // generate here. + String resourceName = stream.next(); + IdentifierTemplate identifierTemplate = model.getIdentifierTemplate(resourceName); + service.addIdentifireTemplate(identifierTemplate); + + if (!isMatchKeyword(stream.checkNext(), COMMA)) break; + + stream.next(); // advance to next token + } + + editor.addWebService(service); // reflect to instance of "WebServiceEditor". + + if (!isMatchKeyword(stream.next(), RIGHT_CURLY_BRACKET)) throw new ExpectedRightBracket(stream.getLine()); + + serviceTokenNode = stream.next(); // serviceTokenNode'll store "}" token. + } + + if (!isMatchKeyword(serviceTokenNode, RIGHT_CURLY_BRACKET)) throw new ExpectedRightBracket(stream.getLine()); + } +}