diff --git a/fr.centralesupelec.edf.riseclipse.main/.classpath b/fr.centralesupelec.edf.riseclipse.main/.classpath new file mode 100644 index 0000000000000000000000000000000000000000..eca7bdba8f03f22510b7980a94dbfe10c16c0901 --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fr.centralesupelec.edf.riseclipse.main/.project b/fr.centralesupelec.edf.riseclipse.main/.project new file mode 100644 index 0000000000000000000000000000000000000000..df09e5573515be9aa6e448fd69586fbb3001b75e --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/.project @@ -0,0 +1,28 @@ + + + fr.centralesupelec.edf.riseclipse.main + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/fr.centralesupelec.edf.riseclipse.main/.settings/org.eclipse.jdt.core.prefs b/fr.centralesupelec.edf.riseclipse.main/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000000000000000000000000000000000..0c68a61dca867ceb49e79d2402935261ec3e3809 --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/fr.centralesupelec.edf.riseclipse.main/META-INF/MANIFEST.MF b/fr.centralesupelec.edf.riseclipse.main/META-INF/MANIFEST.MF new file mode 100644 index 0000000000000000000000000000000000000000..68b123b23f59e9686b21264798fa39adafc3fd93 --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/META-INF/MANIFEST.MF @@ -0,0 +1,11 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: RiseClipse Main Plugin +Bundle-SymbolicName: fr.centralesupelec.edf.riseclipse.main;singleton:=true +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: CentraleSupélec & EDF +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Require-Bundle: org.eclipse.emf.common, + org.eclipse.emf.ecore, + org.eclipse.emf.ecore.xmi +Export-Package: fr.centralesupelec.edf.riseclipse.util diff --git a/fr.centralesupelec.edf.riseclipse.main/build.properties b/fr.centralesupelec.edf.riseclipse.main/build.properties new file mode 100644 index 0000000000000000000000000000000000000000..52c4170f46005ed5c7dfe78f4ee576b5ae989973 --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/build.properties @@ -0,0 +1,20 @@ +# +# Copyright (c) 2017 CentraleSupélec & EDF. +# 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 +# +# This file is part of the RiseClipse tool +# +# Contributors: +# Computer Science Department, CentraleSupélec : initial implementation +# Contacts: +# Dominique.Marcadet@centralesupelec.fr +# + +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + plugin.xml diff --git a/fr.centralesupelec.edf.riseclipse.main/epl-v10.html b/fr.centralesupelec.edf.riseclipse.main/epl-v10.html new file mode 100644 index 0000000000000000000000000000000000000000..3998fcebeebe4d34f47c8777b4db160be1d1dec1 --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/epl-v10.html @@ -0,0 +1,261 @@ + + + + + + +Eclipse Public License - Version 1.0 + + + + + + +

Eclipse Public License - v 1.0

+ +

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE +PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR +DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS +AGREEMENT.

+ +

1. DEFINITIONS

+ +

"Contribution" means:

+ +

a) in the case of the initial Contributor, the initial +code and documentation distributed under this Agreement, and

+

b) in the case of each subsequent Contributor:

+

i) changes to the Program, and

+

ii) additions to the Program;

+

where such changes and/or additions to the Program +originate from and are distributed by that particular Contributor. A +Contribution 'originates' from a Contributor if it was added to the +Program by such Contributor itself or anyone acting on such +Contributor's behalf. Contributions do not include additions to the +Program which: (i) are separate modules of software distributed in +conjunction with the Program under their own license agreement, and (ii) +are not derivative works of the Program.

+ +

"Contributor" means any person or entity that distributes +the Program.

+ +

"Licensed Patents" mean patent claims licensable by a +Contributor which are necessarily infringed by the use or sale of its +Contribution alone or when combined with the Program.

+ +

"Program" means the Contributions distributed in accordance +with this Agreement.

+ +

"Recipient" means anyone who receives the Program under +this Agreement, including all Contributors.

+ +

2. GRANT OF RIGHTS

+ +

a) Subject to the terms of this Agreement, each +Contributor hereby grants Recipient a non-exclusive, worldwide, +royalty-free copyright license to reproduce, prepare derivative works +of, publicly display, publicly perform, distribute and sublicense the +Contribution of such Contributor, if any, and such derivative works, in +source code and object code form.

+ +

b) Subject to the terms of this Agreement, each +Contributor hereby grants Recipient a non-exclusive, worldwide, +royalty-free patent license under Licensed Patents to make, use, sell, +offer to sell, import and otherwise transfer the Contribution of such +Contributor, if any, in source code and object code form. This patent +license shall apply to the combination of the Contribution and the +Program if, at the time the Contribution is added by the Contributor, +such addition of the Contribution causes such combination to be covered +by the Licensed Patents. The patent license shall not apply to any other +combinations which include the Contribution. No hardware per se is +licensed hereunder.

+ +

c) Recipient understands that although each Contributor +grants the licenses to its Contributions set forth herein, no assurances +are provided by any Contributor that the Program does not infringe the +patent or other intellectual property rights of any other entity. Each +Contributor disclaims any liability to Recipient for claims brought by +any other entity based on infringement of intellectual property rights +or otherwise. As a condition to exercising the rights and licenses +granted hereunder, each Recipient hereby assumes sole responsibility to +secure any other intellectual property rights needed, if any. For +example, if a third party patent license is required to allow Recipient +to distribute the Program, it is Recipient's responsibility to acquire +that license before distributing the Program.

+ +

d) Each Contributor represents that to its knowledge it +has sufficient copyright rights in its Contribution, if any, to grant +the copyright license set forth in this Agreement.

+ +

3. REQUIREMENTS

+ +

A Contributor may choose to distribute the Program in object code +form under its own license agreement, provided that:

+ +

a) it complies with the terms and conditions of this +Agreement; and

+ +

b) its license agreement:

+ +

i) effectively disclaims on behalf of all Contributors +all warranties and conditions, express and implied, including warranties +or conditions of title and non-infringement, and implied warranties or +conditions of merchantability and fitness for a particular purpose;

+ +

ii) effectively excludes on behalf of all Contributors +all liability for damages, including direct, indirect, special, +incidental and consequential damages, such as lost profits;

+ +

iii) states that any provisions which differ from this +Agreement are offered by that Contributor alone and not by any other +party; and

+ +

iv) states that source code for the Program is available +from such Contributor, and informs licensees how to obtain it in a +reasonable manner on or through a medium customarily used for software +exchange.

+ +

When the Program is made available in source code form:

+ +

a) it must be made available under this Agreement; and

+ +

b) a copy of this Agreement must be included with each +copy of the Program.

+ +

Contributors may not remove or alter any copyright notices contained +within the Program.

+ +

Each Contributor must identify itself as the originator of its +Contribution, if any, in a manner that reasonably allows subsequent +Recipients to identify the originator of the Contribution.

+ +

4. COMMERCIAL DISTRIBUTION

+ +

Commercial distributors of software may accept certain +responsibilities with respect to end users, business partners and the +like. While this license is intended to facilitate the commercial use of +the Program, the Contributor who includes the Program in a commercial +product offering should do so in a manner which does not create +potential liability for other Contributors. Therefore, if a Contributor +includes the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and +indemnify every other Contributor ("Indemnified Contributor") +against any losses, damages and costs (collectively "Losses") +arising from claims, lawsuits and other legal actions brought by a third +party against the Indemnified Contributor to the extent caused by the +acts or omissions of such Commercial Contributor in connection with its +distribution of the Program in a commercial product offering. The +obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. In +order to qualify, an Indemnified Contributor must: a) promptly notify +the Commercial Contributor in writing of such claim, and b) allow the +Commercial Contributor to control, and cooperate with the Commercial +Contributor in, the defense and any related settlement negotiations. The +Indemnified Contributor may participate in any such claim at its own +expense.

+ +

For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those +performance claims and warranties, and if a court requires any other +Contributor to pay any damages as a result, the Commercial Contributor +must pay those damages.

+ +

5. NO WARRANTY

+ +

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS +PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, +ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY +OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely +responsible for determining the appropriateness of using and +distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement , including but not limited to +the risks and costs of program errors, compliance with applicable laws, +damage to or loss of data, programs or equipment, and unavailability or +interruption of operations.

+ +

6. DISCLAIMER OF LIABILITY

+ +

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT +NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING +WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR +DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED +HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

+ +

7. GENERAL

+ +

If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further action +by the parties hereto, such provision shall be reformed to the minimum +extent necessary to make such provision valid and enforceable.

+ +

If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other +software or hardware) infringes such Recipient's patent(s), then such +Recipient's rights granted under Section 2(b) shall terminate as of the +date such litigation is filed.

+ +

All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of time +after becoming aware of such noncompliance. If all Recipient's rights +under this Agreement terminate, Recipient agrees to cease use and +distribution of the Program as soon as reasonably practicable. However, +Recipient's obligations under this Agreement and any licenses granted by +Recipient relating to the Program shall continue and survive.

+ +

Everyone is permitted to copy and distribute copies of this +Agreement, but in order to avoid inconsistency the Agreement is +copyrighted and may only be modified in the following manner. The +Agreement Steward reserves the right to publish new versions (including +revisions) of this Agreement from time to time. No one other than the +Agreement Steward has the right to modify this Agreement. The Eclipse +Foundation is the initial Agreement Steward. The Eclipse Foundation may +assign the responsibility to serve as the Agreement Steward to a +suitable separate entity. Each new version of the Agreement will be +given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the +Agreement under which it was received. In addition, after a new version +of the Agreement is published, Contributor may elect to distribute the +Program (including its Contributions) under the new version. Except as +expressly stated in Sections 2(a) and 2(b) above, Recipient receives no +rights or licenses to the intellectual property of any Contributor under +this Agreement, whether expressly, by implication, estoppel or +otherwise. All rights in the Program not expressly granted under this +Agreement are reserved.

+ +

This Agreement is governed by the laws of the State of New York and +the intellectual property laws of the United States of America. No party +to this Agreement will bring a legal action under this Agreement more +than one year after the cause of action arose. Each party waives its +rights to a jury trial in any resulting litigation.

+ + + + \ No newline at end of file diff --git a/fr.centralesupelec.edf.riseclipse.main/plugin.xml b/fr.centralesupelec.edf.riseclipse.main/plugin.xml new file mode 100644 index 0000000000000000000000000000000000000000..e56d19fe2e53a159e384ffe6d34c3462af635db4 --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/plugin.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/fr.centralesupelec.edf.riseclipse.main/schema/fr.centralesupelec.edf.riseclipse.exsd b/fr.centralesupelec.edf.riseclipse.main/schema/fr.centralesupelec.edf.riseclipse.exsd new file mode 100644 index 0000000000000000000000000000000000000000..1537ab18973ce87ae8e6ff85ee53ee827489e1a1 --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/schema/fr.centralesupelec.edf.riseclipse.exsd @@ -0,0 +1,160 @@ + + + + + + + + + [Enter description of this extension point.] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Enter the first release in which this extension point appears.] + + + + + + + + + [Enter extension point usage example here.] + + + + + + + + + [Enter API information here.] + + + + + + + + + [Enter information about supplied implementation of this extension point.] + + + + + + + + + Copyright (c) 2017 CentraleSupélec & EDF. +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 + +This file is part of the RiseClipse tool + +Contributors: + Computer Science Department, CentraleSupélec : initial implementation +Contacts: + Dominique.Marcadet@centralesupelec.fr + + + + diff --git a/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/AbstractRiseClipseConsole.java b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/AbstractRiseClipseConsole.java new file mode 100644 index 0000000000000000000000000000000000000000..d53c9b66c100c64811460e540d0c1d9c24f6f7b4 --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/AbstractRiseClipseConsole.java @@ -0,0 +1,116 @@ +/** + * Copyright (c) 2017 CentraleSupélec & EDF. + * 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 + * + * This file is part of the RiseClipse tool + * + * Contributors: + * Computer Science Department, CentraleSupélec : initial implementation + * Contacts: + * Dominique.Marcadet@centralesupelec.fr + */ +package fr.centralesupelec.edf.riseclipse.util; + +/** + * Base class for RiseClipse consoles. + * It implements the Singleton design pattern, handle the level of messages + * and prefixes each message with the level name. + * + * @author Dominique Marcadet + * + */ +public abstract class AbstractRiseClipseConsole implements IRiseClipseConsole { + + /** + * The unique instance of AbstractRiseClipseConsole + */ + protected static IRiseClipseConsole console; + + /** + * Give access to the singleton. + * It creates a {@link TextRiseClipseConsole} if there is none. + * + * @return The unique instance of AbstractRiseClipseConsole + */ + public static synchronized IRiseClipseConsole getConsole() { + if( console == null ) { + console = new TextRiseClipseConsole(); + } + return console; + } + + /** + * The current level of displayed messages + */ + protected int currentLevel; + + /** + * Constructs a new console, using it as the unique one + * (the previous one, if any, is forgotten). + * The initial level is set to {@link IRiseClipseConsole#INFO_LEVEL} + */ + protected AbstractRiseClipseConsole() { + console = this; + currentLevel = INFO_LEVEL; + } + + /** + * Basic implementation of {@link IRiseClipseConsole#setLevel(int)} + */ + public int setLevel( int level ) { + int previousLevel = currentLevel; + if(( level >= INFO_LEVEL ) && ( level <= FATAL_LEVEL )) { + currentLevel = level; + } + return previousLevel; + } + + /** + * Prefixes message with INFO and delegates to {@link AbstractRiseClipseConsole#doOutputMessage(String)} + * if current level is {@link #INFO_LEVEL} + */ + public final void info( Object o ) { + if( currentLevel <= INFO_LEVEL ) { + doOutputMessage( "INFO: " + o.toString() ); + } + } + + /** + * Prefixes message with WARNING and delegates to {@link AbstractRiseClipseConsole#doOutputMessage(String)} + * if current level is {@link #WARNING_LEVEL} or below + */ + public final void warning( Object o ) { + if( currentLevel <= WARNING_LEVEL ) { + doOutputMessage( "WARNING: " + o.toString() ); + } + } + + /** + * Prefixes message with ERROR and delegates to {@link AbstractRiseClipseConsole#doOutputMessage(String)} + * if current level is {@link #ERROR_LEVEL} or below + */ + public final void error( Object o ) { + if( currentLevel <= ERROR_LEVEL ) { + doOutputMessage( "ERROR: " + o.toString() ); + } + } + + /** + * Prefixes message with FATAL and delegates to {@link AbstractRiseClipseConsole#doOutputMessage(String)}, + * then throws a {@link RiseClipseFatalException} + */ + public final void fatal( Object o ) { + doOutputMessage( "FATAL: " + o.toString() ); + throw new RiseClipseFatalException( "FATAL: " + o.toString(), null ); + } + + /** + * Output message s on the current console + * @param m message to display + */ + protected abstract void doOutputMessage( String m ); + +} diff --git a/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/IRiseClipseConsole.java b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/IRiseClipseConsole.java new file mode 100644 index 0000000000000000000000000000000000000000..ce88ab7af43e5a64644053ba68b465de19b33d18 --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/IRiseClipseConsole.java @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2017 CentraleSupélec & EDF. + * 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 + * + * This file is part of the RiseClipse tool + * + * Contributors: + * Computer Science Department, CentraleSupélec : initial implementation + * Contacts: + * Dominique.Marcadet@centralesupelec.fr + */ +package fr.centralesupelec.edf.riseclipse.util; + +/** + * Interface for outputting messages to users. + * It defines four increasing levels of messages and allows + * for choosing the minimal level of displayed messages. + * + * @author Dominique Marcadet + * + */ +public interface IRiseClipseConsole { + + public final static int INFO_LEVEL = 1; + public final static int WARNING_LEVEL = 2; + public final static int ERROR_LEVEL = 3; + public final static int FATAL_LEVEL = 4; + + /** + * Set the current level of displayed messages. + * + * @param level minimal level of messages to be displayed, + * ignored if outside [INFO_LEVEL..FATAL_LEVEL] + * @return the previous level + */ + public int setLevel( int level ); + + /** + * Output message o.toString() if current level is INFO_LEVEL + * + * @param o message to be displayed + */ + public void info( Object o ); + + /** + * Output message o.toString() if current level is WARNING_LEVEL or below + * + * @param o message to be displayed + */ + public void warning( Object o ); + + /** + * Output message o.toString() if current level is ERROR_LEVEL or below + * + * @param o message to be displayed + */ + public void error( Object o ); + + /** + * Output message o.toString() if current level is FATAL_LEVEL or below + * + * @param o message to be displayed + */ + public void fatal( Object o ); + +} + diff --git a/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/IRiseClipseResource.java b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/IRiseClipseResource.java new file mode 100644 index 0000000000000000000000000000000000000000..58c533727f0ff73a44c1128044d333e25673a43f --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/IRiseClipseResource.java @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2017 CentraleSupélec & EDF. + * 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 + * + * This file is part of the RiseClipse tool + * + * Contributors: + * Computer Science Department, CentraleSupélec : initial implementation + * Contacts: + * Dominique.Marcadet@centralesupelec.fr + */ +package fr.centralesupelec.edf.riseclipse.util; + +public interface IRiseClipseResource { + + void printStatistics( IRiseClipseConsole console ); + + void finalizeLoad( boolean ignore_unresolved_reference ); + +} diff --git a/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/RiseClipseFatalException.java b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/RiseClipseFatalException.java new file mode 100644 index 0000000000000000000000000000000000000000..71c2a02e4309924e189f7e8cbe9320eeb70a1df4 --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/RiseClipseFatalException.java @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2017 CentraleSupélec & EDF. + * 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 + * + * This file is part of the RiseClipse tool + * + * Contributors: + * Computer Science Department, CentraleSupélec : initial implementation + * Contacts: + * Dominique.Marcadet@centralesupelec.fr + */ +package fr.centralesupelec.edf.riseclipse.util; + +/** + * This class is for fatal exceptions in RiseClipse, they must + * not be caught. + * + * @author Dominique Marcadet + * + */ +public class RiseClipseFatalException extends RiseClipseRuntimeException { + + private static final long serialVersionUID = 1L; + + public RiseClipseFatalException( String error, Exception e ) { + super( error, e ); + } + +} diff --git a/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/RiseClipseModelLoader.java b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/RiseClipseModelLoader.java new file mode 100644 index 0000000000000000000000000000000000000000..e42099f2d0662c06a531f66c182fbfb87d66e46a --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/RiseClipseModelLoader.java @@ -0,0 +1,123 @@ +/** + * Copyright (c) 2017 CentraleSupélec & EDF. + * 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 + * + * This file is part of the RiseClipse tool + * + * Contributors: + * Computer Science Department, CentraleSupélec : initial implementation + * Contacts: + * Dominique.Marcadet@centralesupelec.fr + */ +package fr.centralesupelec.edf.riseclipse.util; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.eclipse.emf.ecore.xmi.IllegalValueException; + +import fr.centralesupelec.edf.riseclipse.util.IRiseClipseConsole; + + +public abstract class RiseClipseModelLoader { + + protected ResourceSetImpl resourceSet; + protected IRiseClipseConsole console; + + protected RiseClipseModelLoader( IRiseClipseConsole console ) { + this.console = console; + + // Create a resource set to hold the resources. + this.resourceSet = new ResourceSetImpl(); + } + + public ResourceSet getResourceSet() { + return resourceSet; + } + + public Resource load( String name ) { + console.info( "Loading: " + name ); + + int currentSize = resourceSet.getResources().size(); + + // Construct the URI for the instance file. + // The argument is treated as a file path only if it denotes an existing file. + // Otherwise, it's directly treated as a URL. + File file = new File( name ); + URI uri = file.isFile() ? URI.createFileURI( file.getAbsolutePath() ) : URI.createURI( name ); + + ArrayList< URI > resourceURIs = new ArrayList< URI >(); + resourceURIs.add( uri ); + try { + ZipInputStream in = new ZipInputStream( resourceSet.getURIConverter().createInputStream( resourceURIs.get( 0 ))); + ZipEntry entry = in.getNextEntry(); + if( entry != null ) { + String zipURI = resourceURIs.get( 0 ).toString(); + resourceURIs.clear(); + while( entry != null ) { + // Must use "archive:" and not "zip:" to be recognized by ArchiveURIHandlerImpl + resourceURIs.add( URI.createURI( "archive:" + zipURI + "!/" + entry.getName() )); + entry = in.getNextEntry(); + } + } + in.close(); + } + catch( IOException e ) { + // Will be handled later + } + + for( URI resourceURI : resourceURIs ) { + try { + // Load the resource through the editing domain. + // + @SuppressWarnings("unused") + Resource resource = resourceSet.getResource( resourceURI, true ); + } + // This is done by RiseClipseModelLoader in the command line tool + catch( RuntimeException re ) { + Throwable cause = re.getCause(); + if( cause instanceof IllegalValueException ) { + IllegalValueException e = ( IllegalValueException ) cause; + console.error( "value " + e.getValue() + " is not legal at line " + e.getLine() + " for feature " + + e.getFeature().getName() + ", it should be " + e.getFeature().getEType().getInstanceTypeName() ); + } + else if( cause instanceof FileNotFoundException ) { + console.error( "Problem loading " + resourceURI + " : file not found" ); + // Resource has been created ! + // We remove it to return null + if( resourceSet.getResources().size() > currentSize ) { + resourceSet.getResources().remove( currentSize ); + } + } + else { + console.error( "Problem loading " + resourceURI + " : " + cause ); + } + } + catch( Exception e ) { + console.error( "Problem loading " + resourceURI + " : " + e ); + } + + } + + // resourceSet.getResource() return the resource. + // But if an exception occurs, we don't get it ! + // So, we expect that the newly created resource is the last one + // in the resourceSet. + if( resourceSet.getResources().size() > currentSize ) { + return resourceSet.getResources().get( currentSize ); + } + return null; + } + +} diff --git a/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/RiseClipseResourceSet.java b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/RiseClipseResourceSet.java new file mode 100644 index 0000000000000000000000000000000000000000..96a4978c116868333249cf2dee1460c2f9a3e9cd --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/RiseClipseResourceSet.java @@ -0,0 +1,138 @@ +/** + * Copyright (c) 2017 CentraleSupélec & EDF. + * 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 + * + * This file is part of the RiseClipse tool + * + * Contributors: + * Computer Science Department, CentraleSupélec : initial implementation + * Contacts: + * Dominique.Marcadet@centralesupelec.fr + */ +package fr.centralesupelec.edf.riseclipse.util; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.Resource.Factory; +import org.eclipse.emf.ecore.resource.URIConverter; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +public class RiseClipseResourceSet extends ResourceSetImpl { + + private HashMap< String, Factory > resourceFactories; + + private ResourceFactoryFinder factoryFinder; + + public RiseClipseResourceSet( HashMap< String, Resource.Factory > resourceFactories ) { + this.resourceFactories = resourceFactories; + this.factoryFinder = new ResourceFactoryFinder(); + } + + @Override + public Resource createResource( URI uri, String contentType ) { + Resource.Factory f = this.factoryFinder.findFactoryFor( uri ); + // If we don't find any factory registered as RiseClipse metamodel, use the + // standard mechanism. This is at least needed for OCL documents + if( f != null ) { + Resource result = f.createResource( uri ); + getResources().add( result ); + return result; + } + return super.createResource( uri, contentType ); + } + + @SuppressWarnings( "serial" ) + private static class FactoryFoundException extends SAXException { + + private Resource.Factory factory; + + public FactoryFoundException( Resource.Factory factory ) { + this.factory = factory; + } + + public Resource.Factory getFactory() { + return factory; + } + } + + protected class ResourceFactoryFinder { + private SAXParser saxParser; + + public ResourceFactoryFinder() { + SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); + try { + saxParser = saxParserFactory.newSAXParser(); + } + catch( ParserConfigurationException e ) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + catch( SAXException e ) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public Resource.Factory findFactoryFor( URI uri ) { + + DefaultHandler defaultHandler = new DefaultHandler() { + public void startElement( String uri, String localName, String qName, Attributes attributes ) + throws SAXException { + for( int i = 0; i < attributes.getLength(); ++i ) { + String furi = attributes.getURI( i ); + if( furi.length() == 0 ) { + furi = attributes.getQName( i ); + int dc = furi.indexOf( ':' ); + if( dc != -1 ) { + furi = furi.substring( 0, dc ); + } + } + // TODO: define named constant + if( "xmlns".equals( furi ) ) { + String ns = attributes.getValue( i ); + if( RiseClipseResourceSet.this.resourceFactories.containsKey( ns ) ) { + Resource.Factory factory = RiseClipseResourceSet.this.resourceFactories + .get( ns ); + // Stop parsing and give back result + throw new FactoryFoundException( factory ); + } + } + } + } + }; + + try { + URIConverter uriConverter = getURIConverter(); + InputStream inputStream = uriConverter.createInputStream( uri ); + saxParser.parse( inputStream, defaultHandler ); + } + catch( FactoryFoundException e ) { + return e.getFactory(); + } + catch( SAXException e ) { + // Not an xml file or any other error : we will use the standard mechanism + return null; + } + catch( IOException e ) { + // Not an xml file or any other error : we will use the standard mechanism + return null; + } + + return null; + } + } +} diff --git a/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/RiseClipseRuntimeException.java b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/RiseClipseRuntimeException.java new file mode 100644 index 0000000000000000000000000000000000000000..0c244b04b41f51e1583fafa2bf33b7b6a398b6a1 --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/RiseClipseRuntimeException.java @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2017 CentraleSupélec & EDF. + * 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 + * + * This file is part of the RiseClipse tool + * + * Contributors: + * Computer Science Department, CentraleSupélec : initial implementation + * Contacts: + * Dominique.Marcadet@centralesupelec.fr + */ +package fr.centralesupelec.edf.riseclipse.util; + +/** + * This class is a marker for RuntimeException in RiseClipse + * + * @author Dominique Marcadet + * + */ +public class RiseClipseRuntimeException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public RiseClipseRuntimeException( String error, Exception e ) { + super( error, e ); + } + +} diff --git a/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/TextRiseClipseConsole.java b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/TextRiseClipseConsole.java new file mode 100644 index 0000000000000000000000000000000000000000..04c986cf80a7818660e51ff45c20ee48185a2ad7 --- /dev/null +++ b/fr.centralesupelec.edf.riseclipse.main/src/fr/centralesupelec/edf/riseclipse/util/TextRiseClipseConsole.java @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2017 CentraleSupélec & EDF. + * 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 + * + * This file is part of the RiseClipse tool + * + * Contributors: + * Computer Science Department, CentraleSupélec : initial implementation + * Contacts: + * Dominique.Marcadet@centralesupelec.fr + */ +package fr.centralesupelec.edf.riseclipse.util; + +/** + * Basic RiseClipse console on System.out + * + * @author Dominique Marcadet + * + */ +public class TextRiseClipseConsole extends AbstractRiseClipseConsole { + + /** + * Output message on System.out + */ + @Override + protected void doOutputMessage( String m ) { + System.out.println( m ); + System.out.flush(); + } +}